| Index: Source/platform/heap/Heap.cpp
|
| diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp
|
| index ee40e0e47ef93c9ab459c433c2fb9cc5988f360d..2f4a789f3b00cd7dafd4810c20d4d618111c8c01 100644
|
| --- a/Source/platform/heap/Heap.cpp
|
| +++ b/Source/platform/heap/Heap.cpp
|
| @@ -1246,6 +1246,7 @@ void ThreadHeap<Header>::getScannedStats(HeapStats& scannedStats)
|
| template<typename Header>
|
| void ThreadHeap<Header>::sweepNormalPages(HeapStats* stats)
|
| {
|
| + TRACE_EVENT0("blink_gc", "ThreadHeap::sweepNormalPages");
|
| HeapPage<Header>* page = m_firstPage;
|
| HeapPage<Header>** previousNext = &m_firstPage;
|
| HeapPage<Header>* previous = 0;
|
| @@ -1270,6 +1271,7 @@ void ThreadHeap<Header>::sweepNormalPages(HeapStats* stats)
|
| template<typename Header>
|
| void ThreadHeap<Header>::sweepLargePages(HeapStats* stats)
|
| {
|
| + TRACE_EVENT0("blink_gc", "ThreadHeap::sweepLargePages");
|
| LargeHeapObject<Header>** previousNext = &m_firstLargeHeapObject;
|
| for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current;) {
|
| if (current->isMarked()) {
|
| @@ -2461,7 +2463,7 @@ void Heap::prepareForGC()
|
| (*it)->prepareForGC();
|
| }
|
|
|
| -void Heap::collectGarbage(ThreadState::StackState stackState)
|
| +void Heap::collectGarbage(ThreadState::StackState stackState, ThreadState::CauseOfGC cause)
|
| {
|
| ThreadState* state = ThreadState::current();
|
| state->clearGCRequested();
|
| @@ -2478,7 +2480,9 @@ void Heap::collectGarbage(ThreadState::StackState stackState)
|
|
|
| s_lastGCWasConservative = false;
|
|
|
| - TRACE_EVENT0("blink_gc", "Heap::collectGarbage");
|
| + TRACE_EVENT2("blink_gc", "Heap::collectGarbage",
|
| + "precise", stackState == ThreadState::NoHeapPointersOnStack,
|
| + "forced", cause == ThreadState::ForcedGC);
|
| TRACE_EVENT_SCOPED_SAMPLING_STATE("blink_gc", "BlinkGC");
|
| double timeStamp = WTF::currentTimeMS();
|
| #if ENABLE(GC_PROFILE_MARKING)
|
| @@ -2575,6 +2579,7 @@ void Heap::collectGarbageForTerminatingThread(ThreadState* state)
|
|
|
| void Heap::processMarkingStackEntries(int* runningMarkingThreads)
|
| {
|
| + TRACE_EVENT0("blink_gc", "Heap::processMarkingStackEntries");
|
| CallbackStack* stack = 0;
|
| MarkingVisitor visitor(&stack);
|
| {
|
| @@ -2622,11 +2627,13 @@ void Heap::processMarkingStackInParallel()
|
| if (s_markingStack->numberOfBlocksExceeds(numberOfBlocksForParallelMarking)) {
|
| processMarkingStackOnMultipleThreads();
|
| } else {
|
| + TRACE_EVENT0("blink_gc", "Heap::processMarkingStackSingleThreaded");
|
| while (popAndInvokeTraceCallback<GlobalMarking>(s_markingVisitor)) { }
|
| }
|
|
|
| // Mark any strong pointers that have now become reachable in ephemeron
|
| // maps.
|
| + TRACE_EVENT0("blink_gc", "Heap::processEphemeronStack");
|
| CallbackStack::invokeCallbacks(&s_ephemeronStack, s_markingVisitor);
|
|
|
| // Rerun loop if ephemeron processing queued more objects for tracing.
|
| @@ -2642,10 +2649,12 @@ void Heap::processMarkingStack()
|
| // currently pushed onto the marking stack. If Mode is ThreadLocalMarking
|
| // don't continue tracing if the trace hits an object on another thread's
|
| // heap.
|
| + TRACE_EVENT0("blink_gc", "Heap::processMarkingStackSingleThreaded");
|
| while (popAndInvokeTraceCallback<Mode>(s_markingVisitor)) { }
|
|
|
| // Mark any strong pointers that have now become reachable in ephemeron
|
| // maps.
|
| + TRACE_EVENT0("blink_gc", "Heap::processEphemeronStack");
|
| CallbackStack::invokeCallbacks(&s_ephemeronStack, s_markingVisitor);
|
|
|
| // Rerun loop if ephemeron processing queued more objects for tracing.
|
| @@ -2654,6 +2663,7 @@ void Heap::processMarkingStack()
|
|
|
| void Heap::postMarkingProcessing()
|
| {
|
| + TRACE_EVENT0("blink_gc", "Heap::postMarkingProcessing");
|
| // Call post-marking callbacks including:
|
| // 1. the ephemeronIterationDone callbacks on weak tables to do cleanup
|
| // (specifically to clear the queued bits for weak hash tables), and
|
| @@ -2671,6 +2681,7 @@ void Heap::postMarkingProcessing()
|
|
|
| void Heap::globalWeakProcessing()
|
| {
|
| + TRACE_EVENT0("blink_gc", "Heap::globalWeakProcessing");
|
| // Call weak callbacks on objects that may now be pointing to dead
|
| // objects.
|
| while (popAndInvokeWeakPointerCallback(s_markingVisitor)) { }
|
| @@ -2688,7 +2699,7 @@ void Heap::collectAllGarbage()
|
| // some heap allocated objects own objects that contain persistents
|
| // pointing to other heap allocated objects.
|
| for (int i = 0; i < 5; i++)
|
| - collectGarbage(ThreadState::NoHeapPointersOnStack);
|
| + collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadState::ForcedGC);
|
| }
|
|
|
| void Heap::setForcePreciseGCForTesting()
|
|
|