Consider alignment when allocating from a SegregatedFreeList
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Jan 2015 22:26:57 +0000 (22:26 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Jan 2015 22:26:57 +0000 (22:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=140408

Reviewed by Sam Weinig.

In preparation for supporting aligned allocation.

No performance change.

Since this is just one extra branch in an already expensive function,
I decided not to duplicate the function just to avoid the branch in
the un-aligned case.

* bmalloc/SegregatedFreeList.cpp:
(bmalloc::SegregatedFreeList::take):
* bmalloc/SegregatedFreeList.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@178377 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/SegregatedFreeList.cpp
Source/bmalloc/bmalloc/SegregatedFreeList.h

index acbdb6d..8adbd2a 100644 (file)
@@ -1,5 +1,24 @@
 2015-01-13  Geoffrey Garen  <ggaren@apple.com>
 
+        Consider alignment when allocating from a SegregatedFreeList
+        https://bugs.webkit.org/show_bug.cgi?id=140408
+
+        Reviewed by Sam Weinig.
+
+        In preparation for supporting aligned allocation.
+
+        No performance change.
+
+        Since this is just one extra branch in an already expensive function,
+        I decided not to duplicate the function just to avoid the branch in
+        the un-aligned case.
+
+        * bmalloc/SegregatedFreeList.cpp:
+        (bmalloc::SegregatedFreeList::take):
+        * bmalloc/SegregatedFreeList.h:
+
+2015-01-13  Geoffrey Garen  <ggaren@apple.com>
+
         Renamed minimum to size in SegregatedFreeList
         https://bugs.webkit.org/show_bug.cgi?id=140406
 
index 96d132f..8827803 100644 (file)
@@ -81,10 +81,10 @@ Range SegregatedFreeList::takeGreedy(List& list, size_t size)
     return Range();
 }
 
-Range SegregatedFreeList::take(size_t size)
+Range SegregatedFreeList::take(size_t size, size_t alignmentMask)
 {
     for (auto* list = &select(size); list != m_lists.end(); ++list) {
-        Range range = take(*list, size);
+        Range range = take(*list, size, alignmentMask);
         if (!range)
             continue;
 
@@ -104,7 +104,7 @@ INLINE auto SegregatedFreeList::select(size_t size) -> List&
     return m_lists[result];
 }
 
-INLINE Range SegregatedFreeList::take(List& list, size_t size)
+INLINE Range SegregatedFreeList::take(List& list, size_t size, size_t alignmentMask)
 {
     Range first;
     size_t end = list.size() > segregatedFreeListSearchDepth ? list.size() - segregatedFreeListSearchDepth : 0;
@@ -122,6 +122,9 @@ INLINE Range SegregatedFreeList::take(List& list, size_t size)
         if (range.size() < size)
             continue;
 
+        if (test(range.begin(), alignmentMask))
+            continue;
+
         if (!!first && first < range)
             continue;
 
index be8ef95..f3f3f6c 100644 (file)
@@ -38,11 +38,12 @@ public:
 
     void insert(const Range&);
 
-    // Returns a reasonable fit for the provided size, or Range() if no fit
-    // is found. May return Range() spuriously if searching takes too long.
-    // Incrementally removes stale items from the free list while searching.
-    // Does not eagerly remove the returned range from the free list.
-    Range take(size_t);
+    // Returns a reasonable fit for the provided size and optional alignment
+    // mask, or Range() if no fit is found. May return Range() spuriously if
+    // searching takes too long. Incrementally removes stale items from the
+    // free list while searching. Does not eagerly remove the returned range
+    // from the free list.
+    Range take(size_t, size_t alignmentMask = 0);
 
     // Returns an unreasonable fit for the provided size, or Range() if no fit
     // is found. Never returns Range() spuriously.
@@ -54,8 +55,7 @@ private:
     typedef Vector<Range> List;
 
     List& select(size_t);
-
-    Range take(List&, size_t);
+    Range take(List&, size_t, size_t alignmentMask);
     Range takeGreedy(List&, size_t);
 
     std::array<List, 19> m_lists;