Index: third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp b/third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp |
index e8d9a27d82095dc1d91499b68b95a6e32f716456..ebf4175d16b92685dbcd040effcfd4b919dcaaf5 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/V8GCController.cpp |
@@ -353,41 +353,41 @@ void V8GCController::gcEpilogue(v8::Isolate* isolate, v8::GCType type, v8::GCCal |
if (BlameContext* blameContext = Platform::current()->topLevelBlameContext()) |
blameContext->Leave(); |
- // v8::kGCCallbackFlagForced forces a Blink heap garbage collection |
- // when a garbage collection was forced from V8. This is either used |
- // for tests that force GCs from JavaScript to verify that objects die |
- // when expected. |
- if (flags & v8::kGCCallbackFlagForced) { |
- // This single GC is not enough for two reasons: |
- // (1) The GC is not precise because the GC scans on-stack pointers conservatively. |
- // (2) One GC is not enough to break a chain of persistent handles. It's possible that |
- // some heap allocated objects own objects that contain persistent handles |
- // pointing to other heap allocated objects. To break the chain, we need multiple GCs. |
- // |
- // Regarding (1), we force a precise GC at the end of the current event loop. So if you want |
- // to collect all garbage, you need to wait until the next event loop. |
- // Regarding (2), it would be OK in practice to trigger only one GC per gcEpilogue, because |
- // GCController.collectAll() forces multiple V8's GC. |
- ThreadHeap::collectGarbage(BlinkGC::HeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); |
- |
- // Forces a precise GC at the end of the current event loop. |
- if (ThreadState::current()) { |
+ if (ThreadState::current() && !ThreadState::current()->isGCForbidden()) { |
sof
2016/06/20 08:31:47
early return not feasible?
haraken
2016/06/20 08:36:19
Due to the TRACE_EVENT at line 393.
sof
2016/06/20 08:39:01
Yes, but what counters do you need to update if no
|
+ // v8::kGCCallbackFlagForced forces a Blink heap garbage collection |
+ // when a garbage collection was forced from V8. This is either used |
+ // for tests that force GCs from JavaScript to verify that objects die |
+ // when expected. |
+ if (flags & v8::kGCCallbackFlagForced) { |
+ // This single GC is not enough for two reasons: |
+ // (1) The GC is not precise because the GC scans on-stack pointers conservatively. |
+ // (2) One GC is not enough to break a chain of persistent handles. It's possible that |
+ // some heap allocated objects own objects that contain persistent handles |
+ // pointing to other heap allocated objects. To break the chain, we need multiple GCs. |
+ // |
+ // Regarding (1), we force a precise GC at the end of the current event loop. So if you want |
+ // to collect all garbage, you need to wait until the next event loop. |
+ // Regarding (2), it would be OK in practice to trigger only one GC per gcEpilogue, because |
+ // GCController.collectAll() forces multiple V8's GC. |
+ ThreadHeap::collectGarbage(BlinkGC::HeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); |
+ |
+ // Forces a precise GC at the end of the current event loop. |
RELEASE_ASSERT(!ThreadState::current()->isInGC()); |
ThreadState::current()->setGCState(ThreadState::FullGCScheduled); |
} |
- } |
- // v8::kGCCallbackFlagCollectAllAvailableGarbage is used when V8 handles |
- // low memory notifications. |
- if (flags & v8::kGCCallbackFlagCollectAllAvailableGarbage) { |
- // This single GC is not enough. See the above comment. |
- ThreadHeap::collectGarbage(BlinkGC::HeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); |
- |
- // Do not force a precise GC at the end of the current event loop. |
- // According to UMA stats, the collection rate of the precise GC |
- // scheduled at the end of the low memory handling is extremely low, |
- // because the above conservative GC is sufficient for collecting |
- // most objects. So we intentionally don't schedule a precise GC here. |
+ // v8::kGCCallbackFlagCollectAllAvailableGarbage is used when V8 handles |
+ // low memory notifications. |
+ if (flags & v8::kGCCallbackFlagCollectAllAvailableGarbage) { |
+ // This single GC is not enough. See the above comment. |
+ ThreadHeap::collectGarbage(BlinkGC::HeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); |
+ |
+ // Do not force a precise GC at the end of the current event loop. |
+ // According to UMA stats, the collection rate of the precise GC |
+ // scheduled at the end of the low memory handling is extremely low, |
+ // because the above conservative GC is sufficient for collecting |
+ // most objects. So we intentionally don't schedule a precise GC here. |
+ } |
} |
TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", TRACE_EVENT_SCOPE_THREAD, "data", InspectorUpdateCountersEvent::data()); |