From 3aca47b7aa4bf2d9156d62b9d6bf27a6761890c9 Mon Sep 17 00:00:00 2001 From: mlippautz Date: Thu, 13 Aug 2015 10:22:47 -0700 Subject: [PATCH] [api] Do not force external GCs when only trying to synchronously process phantom callbacks Improves on aec8987b5ee55fa46b90b58927e957a4e5f19c09 by not forcing external GCs (blink) through the GC epilogue callback. BUG=chromium:515795 LOG=N Review URL: https://codereview.chromium.org/1287323002 Cr-Commit-Position: refs/heads/master@{#30164} --- include/v8.h | 4 ++-- src/api.cc | 10 ++++++---- src/global-handles.cc | 4 +++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/include/v8.h b/include/v8.h index 71a1805..fc33810 100644 --- a/include/v8.h +++ b/include/v8.h @@ -4965,9 +4965,9 @@ enum GCType { enum GCCallbackFlags { kNoGCCallbackFlags = 0, - kGCCallbackFlagCompacted = 1 << 0, kGCCallbackFlagConstructRetainedObjectInfos = 1 << 1, - kGCCallbackFlagForced = 1 << 2 + kGCCallbackFlagForced = 1 << 2, + kGCCallbackFlagSynchronousPhantomCallbackProcessing = 1 << 3 }; typedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags); diff --git a/src/api.cc b/src/api.cc index 4f98293..5bb56e6 100644 --- a/src/api.cc +++ b/src/api.cc @@ -6882,11 +6882,13 @@ void Isolate::CollectAllGarbage(const char* gc_reason) { i::Heap* heap = reinterpret_cast(this)->heap(); if (heap->incremental_marking()->IsStopped()) { if (heap->incremental_marking()->CanBeActivated()) { - heap->StartIncrementalMarking(i::Heap::kNoGCFlags, kGCCallbackFlagForced, - gc_reason); + heap->StartIncrementalMarking( + i::Heap::kNoGCFlags, + kGCCallbackFlagSynchronousPhantomCallbackProcessing, gc_reason); } else { - heap->CollectAllGarbage(i::Heap::kNoGCFlags, gc_reason, - kGCCallbackFlagForced); + heap->CollectAllGarbage( + i::Heap::kNoGCFlags, gc_reason, + kGCCallbackFlagSynchronousPhantomCallbackProcessing); } } else { // Incremental marking is turned on an has already been started. diff --git a/src/global-handles.cc b/src/global-handles.cc index 444614c..fcf896f 100644 --- a/src/global-handles.cc +++ b/src/global-handles.cc @@ -883,7 +883,9 @@ int GlobalHandles::PostGarbageCollectionProcessing( const int initial_post_gc_processing_count = ++post_gc_processing_count_; int freed_nodes = 0; bool synchronous_second_pass = - (gc_callback_flags & kGCCallbackFlagForced) != 0; + (gc_callback_flags & + (kGCCallbackFlagForced | + kGCCallbackFlagSynchronousPhantomCallbackProcessing)) != 0; freed_nodes += DispatchPendingPhantomCallbacks(synchronous_second_pass); if (initial_post_gc_processing_count != post_gc_processing_count_) { // If the callbacks caused a nested GC, then return. See comment in -- 2.7.4