Index: third_party/WebKit/Source/platform/heap/Heap.cpp |
diff --git a/third_party/WebKit/Source/platform/heap/Heap.cpp b/third_party/WebKit/Source/platform/heap/Heap.cpp |
index 97ce82652ee13f4f0faa6d619a769c9dda901936..e0b5cb80ec238d28fcb9ab05fb363996602e8b87 100644 |
--- a/third_party/WebKit/Source/platform/heap/Heap.cpp |
+++ b/third_party/WebKit/Source/platform/heap/Heap.cpp |
@@ -145,8 +145,9 @@ void ThreadHeapStats::decreaseAllocatedSpace(size_t delta) { |
ProcessHeap::decreaseTotalAllocatedSpace(delta); |
} |
-ThreadHeap::ThreadHeap() |
- : m_regionTree(WTF::makeUnique<RegionTree>()), |
+ThreadHeap::ThreadHeap(ThreadState* threadState) |
+ : m_threadState(threadState), |
+ m_regionTree(WTF::makeUnique<RegionTree>()), |
m_heapDoesNotContainCache(WTF::wrapUnique(new HeapDoesNotContainCache)), |
m_freePagePool(WTF::wrapUnique(new PagePool)), |
m_markingStack(CallbackStack::create()), |
@@ -160,41 +161,9 @@ ThreadHeap::ThreadHeap() |
ThreadHeap::~ThreadHeap() { |
} |
-void ThreadHeap::attach(ThreadState* thread) { |
- MutexLocker locker(m_threadAttachMutex); |
- m_threads.insert(thread); |
-} |
- |
-void ThreadHeap::detach(ThreadState* thread) { |
- ASSERT(ThreadState::current() == thread); |
- bool isLastThread = false; |
- { |
- // Grab the threadAttachMutex to ensure only one thread can shutdown at |
- // a time and that no other thread can do a global GC. It also allows |
- // safe iteration of the m_threads set which happens as part of |
- // thread local GC asserts. We enter a safepoint while waiting for the |
- // lock to avoid a dead-lock where another thread has already requested |
- // GC. |
- MutexLocker locker(m_threadAttachMutex); |
- thread->runTerminationGC(); |
- ASSERT(m_threads.contains(thread)); |
- m_threads.erase(thread); |
- isLastThread = m_threads.isEmpty(); |
- } |
- if (thread->isMainThread()) |
- DCHECK_EQ(heapStats().allocatedSpace(), 0u); |
- if (isLastThread) |
- delete this; |
-} |
- |
#if DCHECK_IS_ON() |
BasePage* ThreadHeap::findPageFromAddress(Address address) { |
- MutexLocker locker(m_threadAttachMutex); |
- for (ThreadState* state : m_threads) { |
- if (BasePage* page = state->findPageFromAddress(address)) |
- return page; |
- } |
- return nullptr; |
+ return m_threadState->findPageFromAddress(address); |
} |
#endif |
@@ -346,19 +315,16 @@ void ThreadHeap::decommitCallbackStacks() { |
void ThreadHeap::preGC() { |
ASSERT(!ThreadState::current()->isInGC()); |
- for (ThreadState* state : m_threads) |
- state->preGC(); |
+ m_threadState->preGC(); |
} |
void ThreadHeap::postGC(BlinkGC::GCType gcType) { |
ASSERT(ThreadState::current()->isInGC()); |
- for (ThreadState* state : m_threads) |
- state->postGC(gcType); |
+ m_threadState->postGC(gcType); |
} |
void ThreadHeap::preSweep(BlinkGC::GCType gcType) { |
- for (ThreadState* state : m_threads) |
- state->preSweep(gcType); |
+ m_threadState->preSweep(gcType); |
} |
void ThreadHeap::processMarkingStack(Visitor* visitor) { |
@@ -510,15 +476,12 @@ void ThreadHeap::reportMemoryUsageForTracing() { |
} |
size_t ThreadHeap::objectPayloadSizeForTesting() { |
- // MEMO: is threadAttachMutex locked? |
size_t objectPayloadSize = 0; |
- for (ThreadState* state : m_threads) { |
- state->setGCState(ThreadState::GCRunning); |
- state->makeConsistentForGC(); |
- objectPayloadSize += state->objectPayloadSizeForTesting(); |
- state->setGCState(ThreadState::Sweeping); |
- state->setGCState(ThreadState::NoGCScheduled); |
- } |
+ m_threadState->setGCState(ThreadState::GCRunning); |
+ m_threadState->makeConsistentForGC(); |
+ objectPayloadSize += m_threadState->objectPayloadSizeForTesting(); |
+ m_threadState->setGCState(ThreadState::Sweeping); |
+ m_threadState->setGCState(ThreadState::NoGCScheduled); |
return objectPayloadSize; |
} |
@@ -527,15 +490,13 @@ void ThreadHeap::visitPersistentRoots(Visitor* visitor) { |
TRACE_EVENT0("blink_gc", "ThreadHeap::visitPersistentRoots"); |
ProcessHeap::crossThreadPersistentRegion().tracePersistentNodes(visitor); |
- for (ThreadState* state : m_threads) |
- state->visitPersistents(visitor); |
+ m_threadState->visitPersistents(visitor); |
} |
void ThreadHeap::visitStackRoots(Visitor* visitor) { |
ASSERT(ThreadState::current()->isInGC()); |
TRACE_EVENT0("blink_gc", "ThreadHeap::visitStackRoots"); |
- for (ThreadState* state : m_threads) |
- state->visitStack(visitor); |
+ m_threadState->visitStack(visitor); |
} |
BasePage* ThreadHeap::lookupPageForAddress(Address address) { |
@@ -555,8 +516,7 @@ void ThreadHeap::resetHeapCounters() { |
ProcessHeap::decreaseTotalMarkedObjectSize(m_stats.markedObjectSize()); |
m_stats.reset(); |
- for (ThreadState* state : m_threads) |
- state->resetHeapCounters(); |
+ m_threadState->resetHeapCounters(); |
} |
ThreadHeap* ThreadHeap::s_mainThreadHeap = nullptr; |