Chromium Code Reviews| Index: Source/platform/heap/ThreadState.cpp |
| diff --git a/Source/platform/heap/ThreadState.cpp b/Source/platform/heap/ThreadState.cpp |
| index d3bc5cf73f62b1ae1a609758caa3d729b47f007e..3bbda6d783a25f32e49b2d8ab12e5066e9477b1c 100644 |
| --- a/Source/platform/heap/ThreadState.cpp |
| +++ b/Source/platform/heap/ThreadState.cpp |
| @@ -1114,6 +1114,10 @@ void ThreadState::performPendingSweep() |
| // Perform thread-specific weak processing. |
| while (popAndInvokeWeakPointerCallback(Heap::s_markingVisitor)) { } |
| } |
| + { |
| + TRACE_EVENT0("blink_gc", "ThreadState::invokePreFinalizers"); |
| + invokePreFinalizers(*Heap::s_markingVisitor); |
|
haraken
2014/10/06 01:55:27
Just to confirm: The main difference between weak
|
| + } |
| leaveNoAllocationScope(); |
| // Perform sweeping and finalization. |
| @@ -1247,6 +1251,25 @@ ThreadState::AttachedThreadStateSet& ThreadState::attachedThreads() |
| return threads; |
| } |
| +void ThreadState::unregisterPreFinalizerInternal(void* target) |
| +{ |
| + if (isSweepInProgress()) |
| + return; |
| + auto it = m_preFinalizers.find(target); |
| + ASSERT(it != m_preFinalizers.end()); |
| + m_preFinalizers.remove(it); |
| +} |
| + |
| +void ThreadState::invokePreFinalizers(Visitor& visitor) |
| +{ |
| + Vector<void*> deadObjects; |
| + for (auto& entry : m_preFinalizers) { |
| + if (entry.value(entry.key, visitor)) |
| + deadObjects.append(entry.key); |
| + } |
| + m_preFinalizers.removeAll(deadObjects); |
| +} |
| + |
| #if ENABLE(GC_PROFILE_MARKING) |
| const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) |
| { |