| Index: Source/wtf/PartitionAlloc.h
|
| diff --git a/Source/wtf/PartitionAlloc.h b/Source/wtf/PartitionAlloc.h
|
| index bc5f8881f35852a797c861dee6e470ed36783ed0..92fa182d31e763fdcc8388e1c233ce587e6255d0 100644
|
| --- a/Source/wtf/PartitionAlloc.h
|
| +++ b/Source/wtf/PartitionAlloc.h
|
| @@ -223,18 +223,13 @@ struct PartitionFreelistEntry {
|
| // active list. If there are no suitable active pages found, a free page (if one
|
| // exists) will be pulled from the free list on to the active list.
|
| struct PartitionPage {
|
| - union { // Accessed most in hot path => goes first.
|
| - PartitionFreelistEntry* freelistHead; // If the page is active.
|
| - PartitionPage* freePageNext; // If the page is free.
|
| - } u;
|
| - PartitionPage* activePageNext;
|
| + PartitionFreelistEntry* freelistHead;
|
| + PartitionPage* nextPage;
|
| PartitionBucket* bucket;
|
| int16_t numAllocatedSlots; // Deliberately signed, -1 for free page, -n for full pages.
|
| uint16_t numUnprovisionedSlots;
|
| uint16_t pageOffset;
|
| - uint16_t flags;
|
| };
|
| -static uint16_t kPartitionPageFlagFree = 1;
|
|
|
| struct PartitionBucket {
|
| PartitionPage* activePagesHead; // Accessed most in hot path => goes first.
|
| @@ -471,34 +466,17 @@ ALWAYS_INLINE bool partitionPointerIsValid(PartitionRootBase* root, void* ptr)
|
| return false;
|
| }
|
|
|
| -ALWAYS_INLINE bool partitionPageIsFree(PartitionPage* page)
|
| -{
|
| - return (page->flags & kPartitionPageFlagFree);
|
| -}
|
| -
|
| -ALWAYS_INLINE PartitionFreelistEntry* partitionPageFreelistHead(PartitionPage* page)
|
| -{
|
| - ASSERT((page == &PartitionRootBase::gSeedPage && !page->u.freelistHead) || !partitionPageIsFree(page));
|
| - return page->u.freelistHead;
|
| -}
|
| -
|
| -ALWAYS_INLINE void partitionPageSetFreelistHead(PartitionPage* page, PartitionFreelistEntry* newHead)
|
| -{
|
| - ASSERT(!partitionPageIsFree(page));
|
| - page->u.freelistHead = newHead;
|
| -}
|
| -
|
| ALWAYS_INLINE void* partitionBucketAlloc(PartitionRootBase* root, size_t size, PartitionBucket* bucket)
|
| {
|
| PartitionPage* page = bucket->activePagesHead;
|
| - ASSERT(page == &PartitionRootBase::gSeedPage || page->numAllocatedSlots >= 0);
|
| - void* ret = partitionPageFreelistHead(page);
|
| + ASSERT(page->numAllocatedSlots >= 0);
|
| + void* ret = page->freelistHead;
|
| if (LIKELY(ret != 0)) {
|
| // If these asserts fire, you probably corrupted memory.
|
| ASSERT(partitionPointerIsValid(root, ret));
|
| ASSERT(partitionPointerToPage(ret));
|
| PartitionFreelistEntry* newHead = partitionFreelistMask(static_cast<PartitionFreelistEntry*>(ret)->next);
|
| - partitionPageSetFreelistHead(page, newHead);
|
| + page->freelistHead = newHead;
|
| ASSERT(!ret || partitionPointerIsValid(root, ret));
|
| ASSERT(!ret || partitionPointerToPage(ret));
|
| page->numAllocatedSlots++;
|
| @@ -554,14 +532,15 @@ ALWAYS_INLINE void partitionFreeWithPage(void* ptr, PartitionPage* page)
|
| ASSERT(*(static_cast<uintptr_t*>(ptrEnd) - 1) == kCookieValue);
|
| memset(ptr, kFreedByte, bucketSize);
|
| #endif
|
| - PartitionFreelistEntry* freelistHead = partitionPageFreelistHead(page);
|
| + ASSERT(page->numAllocatedSlots);
|
| + PartitionFreelistEntry* freelistHead = page->freelistHead;
|
| ASSERT(!freelistHead || partitionPointerIsValid(partitionPageToRoot(page), freelistHead));
|
| ASSERT(!freelistHead || partitionPointerToPage(freelistHead));
|
| RELEASE_ASSERT(ptr != freelistHead); // Catches an immediate double free.
|
| ASSERT(!freelistHead || ptr != partitionFreelistMask(freelistHead->next)); // Look for double free one level deeper in debug.
|
| PartitionFreelistEntry* entry = static_cast<PartitionFreelistEntry*>(ptr);
|
| entry->next = partitionFreelistMask(freelistHead);
|
| - partitionPageSetFreelistHead(page, entry);
|
| + page->freelistHead = entry;
|
| --page->numAllocatedSlots;
|
| if (UNLIKELY(page->numAllocatedSlots <= 0))
|
| partitionFreeSlowPath(page);
|
|
|