Index: Source/platform/heap/ThreadState.h |
diff --git a/Source/platform/heap/ThreadState.h b/Source/platform/heap/ThreadState.h |
index 85d4acab08d92585f1fb7e9ff936405f63805a1e..f79209f50e922b927386a0ed4a55cc1617f89315 100644 |
--- a/Source/platform/heap/ThreadState.h |
+++ b/Source/platform/heap/ThreadState.h |
@@ -468,6 +468,20 @@ public: |
m_endOfStack = endOfStack; |
} |
+ // MarkingTask functions are called before and after marking live objects. |
+ // They might be called on threads other than the thread associated to this |
+ // ThreadState. |
+ class MarkingTask { |
+ public: |
+ virtual ~MarkingTask() { } |
+ virtual void willStartMarking(ThreadState&) { } |
+ virtual void didFinishMarking(ThreadState&) { } |
+ }; |
+ // A caller is responsible to call removeMarkingTask before deleting the |
+ // specified task. |
+ void addMarkingTask(MarkingTask*); |
+ void removeMarkingTask(MarkingTask*); |
+ |
// Get one of the heap structures for this thread. |
// |
// The heap is split into multiple heap parts based on object |
@@ -480,7 +494,7 @@ public: |
// address ranges for the Blink heap. If the address is in the Blink |
// heap the containing heap page is returned. |
BaseHeapPage* findPageFromAddress(Address); |
- BaseHeapPage* findPageFromAddress(void* pointer) { return findPageFromAddress(reinterpret_cast<Address>(pointer)); } |
+ BaseHeapPage* findPageFromAddress(const void* pointer) { return findPageFromAddress(reinterpret_cast<Address>(const_cast<void*>(pointer))); } |
#endif |
// List of persistent roots allocated on the given thread. |
@@ -570,6 +584,15 @@ public: |
unregisterPreFinalizerInternal(&target); |
} |
+ // Mark an on-heap object as a zombie. The object won't be swept until |
+ // purifyZombies(). It's ok to call markAsZombie() during weak processing. |
+ // The specified object must not have references to objects owned by other |
+ // threads. |
+ // Do not use this function. This is only for WebAudio. |
+ void markAsZombie(void*); |
+ // Purify all of zombie objects marked before calling purifyZombies(). |
+ void purifyZombies(); |
+ |
Vector<PageMemoryRegion*>& allocatedRegionsSinceLastGC() { return m_allocatedRegionsSinceLastGC; } |
void shouldFlushHeapDoesNotContainCache() { m_shouldFlushHeapDoesNotContainCache = true; } |
@@ -621,6 +644,8 @@ private: |
void unregisterPreFinalizerInternal(void*); |
void invokePreFinalizers(Visitor&); |
+ void invokePreMarkingTasks(); |
+ void invokePostMarkingTasks(); |
#if ENABLE(GC_PROFILING) |
void snapshotFreeList(); |
@@ -658,6 +683,7 @@ private: |
Vector<OwnPtr<CleanupTask>> m_cleanupTasks; |
bool m_isTerminating; |
+ Vector<MarkingTask*> m_markingTasks; |
bool m_shouldFlushHeapDoesNotContainCache; |
double m_collectionRate; |
@@ -665,7 +691,7 @@ private: |
CallbackStack* m_weakCallbackStack; |
HashMap<void*, bool (*)(void*, Visitor&)> m_preFinalizers; |
- |
+ HashSet<void*> m_zombies; |
v8::Isolate* m_isolate; |
void (*m_traceDOMWrappers)(v8::Isolate*, Visitor*); |