Chromium Code Reviews| Index: Source/platform/heap/Heap.h |
| diff --git a/Source/platform/heap/Heap.h b/Source/platform/heap/Heap.h |
| index f006bb647cb850a3598420fbc56b7a2093ee1fda..d5e09a0329de6bb1d7226ca71c35bdc719cecf9b 100644 |
| --- a/Source/platform/heap/Heap.h |
| +++ b/Source/platform/heap/Heap.h |
| @@ -401,11 +401,33 @@ public: |
| bool terminating() { return m_terminating; } |
| void setTerminating() { m_terminating = true; } |
| + // Returns true if this page has been swept by the ongoing lazy sweep. |
| + bool hasBeenSwept() const { return m_swept; } |
| + |
| + void markAsSwept() |
| + { |
| + ASSERT(!m_swept); |
| + m_swept = true; |
| + } |
| + |
| + void markAsUnswept() |
| + { |
| + ASSERT(m_swept); |
| + m_swept = false; |
| + } |
| + |
| private: |
| PageMemory* m_storage; |
| ThreadHeap* m_heap; |
| // Whether the page is part of a terminating thread or not. |
| bool m_terminating; |
| + |
| + // Track the sweeping state of a page. Set to true once |
| + // the lazy sweep completes has processed it. |
| + // |
| + // Set to false at the start of a sweep, true upon completion |
| + // of lazy sweeping. |
| + bool m_swept; |
| }; |
| class HeapPage final : public BaseHeapPage { |
| @@ -783,7 +805,7 @@ private: |
| #endif |
| bool coalesce(); |
| - void markUnmarkedObjectsDead(); |
| + void preparePagesForSweeping(); |
| Address m_currentAllocationPoint; |
| size_t m_remainingAllocationSize; |
| @@ -806,6 +828,18 @@ private: |
| size_t m_promptlyFreedSize; |
| }; |
| +// Mask an address down to the enclosing oilpan heap base page. All oilpan heap |
| +// pages are aligned at blinkPageBase plus an OS page size. |
| +// FIXME: Remove PLATFORM_EXPORT once we get a proper public interface to our |
| +// typed heaps. This is only exported to enable tests in HeapTest.cpp. |
| +PLATFORM_EXPORT inline BaseHeapPage* pageFromObject(const void* object) |
| +{ |
| + Address address = reinterpret_cast<Address>(const_cast<void*>(object)); |
| + BaseHeapPage* page = reinterpret_cast<BaseHeapPage*>(blinkPageAddress(address) + WTF::kSystemPageSize); |
| + ASSERT(page->contains(address)); |
| + return page; |
| +} |
| + |
| class PLATFORM_EXPORT Heap { |
| public: |
| static void init(); |
| @@ -818,6 +852,32 @@ public: |
| static bool containedInHeapOrOrphanedPage(void*); |
| #endif |
| + // Is the finalizable GC object still alive? If no GC is in progress, |
| + // it must be true. If a lazy sweep is in progress, it will be true if |
| + // the object hasn't been swept yet and it is marked, or it has |
| + // been swept and it is still alive. |
| + // |
| + // isFinalizedObjectAlive() must not be used with already-finalized object |
| + // references. |
| + // |
|
haraken
2015/01/19 05:35:49
A couple of suggestions to clean up the method and
|
| + template<typename T> |
| + static bool isFinalizedObjectAlive(const T* objectPointer) |
| + { |
| + static_assert(IsGarbageCollectedType<T>::value, "only objects deriving from GarbageCollected can be used."); |
| +#if ENABLE(OILPAN) |
| + BaseHeapPage* page = pageFromObject(objectPointer); |
| + if (page->hasBeenSwept()) |
| + return true; |
| + ASSERT(page->heap()->threadState()->isSweepingInProgress()); |
| + |
| + return ObjectAliveTrait<T>::isHeapObjectAlive(s_markingVisitor, const_cast<T*>(objectPointer)); |
| +#else |
| + // FIXME: remove when lazy sweeping is always on |
| + // (cf. ThreadState::postGCProcessing()). |
| + return true; |
| +#endif |
| + } |
| + |
| // Push a trace callback on the marking stack. |
| static void pushTraceCallback(void* containerObject, TraceCallback); |
| @@ -1190,18 +1250,6 @@ private: |
| #define GC_PLUGIN_IGNORE(bug) |
| #endif |
| -// Mask an address down to the enclosing oilpan heap base page. All oilpan heap |
| -// pages are aligned at blinkPageBase plus an OS page size. |
| -// FIXME: Remove PLATFORM_EXPORT once we get a proper public interface to our |
| -// typed heaps. This is only exported to enable tests in HeapTest.cpp. |
| -PLATFORM_EXPORT inline BaseHeapPage* pageFromObject(const void* object) |
| -{ |
| - Address address = reinterpret_cast<Address>(const_cast<void*>(object)); |
| - BaseHeapPage* page = reinterpret_cast<BaseHeapPage*>(blinkPageAddress(address) + WTF::kSystemPageSize); |
| - ASSERT(page->contains(address)); |
| - return page; |
| -} |
| - |
| NO_SANITIZE_ADDRESS inline |
| size_t HeapObjectHeader::size() const |
| { |