Index: src/heap.cc |
=================================================================== |
--- src/heap.cc (revision 3984) |
+++ src/heap.cc (working copy) |
@@ -115,8 +115,11 @@ |
int Heap::always_allocate_scope_depth_ = 0; |
int Heap::linear_allocation_scope_depth_ = 0; |
-bool Heap::context_disposed_pending_ = false; |
+int Heap::contexts_disposed_ = 0; |
+bool Heap::context_disposed_use_deprecated_heuristic_ = true; |
+bool Heap::context_disposed_deprecated_pending_ = false; |
+ |
#ifdef DEBUG |
bool Heap::allocation_allowed_ = true; |
@@ -371,24 +374,32 @@ |
} |
-void Heap::CollectAllGarbageIfContextDisposed() { |
+void Heap::CollectAllGarbageIfContextDisposedDeprecated() { |
+ if (!context_disposed_use_deprecated_heuristic_) return; |
// If the garbage collector interface is exposed through the global |
// gc() function, we avoid being clever about forcing GCs when |
// contexts are disposed and leave it to the embedder to make |
// informed decisions about when to force a collection. |
- if (!FLAG_expose_gc && context_disposed_pending_) { |
+ if (!FLAG_expose_gc && context_disposed_deprecated_pending_) { |
HistogramTimerScope scope(&Counters::gc_context); |
CollectAllGarbage(false); |
} |
- context_disposed_pending_ = false; |
+ context_disposed_deprecated_pending_ = false; |
} |
void Heap::NotifyContextDisposed() { |
- context_disposed_pending_ = true; |
+ context_disposed_use_deprecated_heuristic_ = false; |
+ contexts_disposed_++; |
} |
+void Heap::NotifyContextDisposedDeprecated() { |
+ if (!context_disposed_use_deprecated_heuristic_) return; |
+ context_disposed_deprecated_pending_ = true; |
+} |
+ |
+ |
bool Heap::CollectGarbage(int requested_size, AllocationSpace space) { |
// The VM is in the GC state until exiting this function. |
VMState state(GC); |
@@ -620,7 +631,9 @@ |
Shrink(); |
Counters::objs_since_last_full.Set(0); |
- context_disposed_pending_ = false; |
+ |
+ contexts_disposed_ = 0; |
+ context_disposed_deprecated_pending_ = false; |
} |
@@ -3072,6 +3085,13 @@ |
static int number_idle_notifications = 0; |
static int last_gc_count = gc_count_; |
+ if (!FLAG_expose_gc && (contexts_disposed_ > 0)) { |
+ HistogramTimerScope scope(&Counters::gc_context); |
+ CollectAllGarbage(false); |
+ ASSERT(contexts_disposed_ == 0); |
+ return false; |
+ } |
+ |
bool finished = false; |
if (last_gc_count == gc_count_) { |