| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 3981)
|
| +++ 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,32 +374,32 @@
|
| }
|
|
|
|
|
| -void Heap::CollectAllGarbageIfContextDisposed(bool notified) {
|
| - // If the request has ever been the result of an explicit
|
| - // notification, we ignore non-notified requests. This is a
|
| - // temporary solution to let the two ways of achieving GC at
|
| - // context disposal time co-exist.
|
| - static bool ever_notified = false;
|
| - if (notified) ever_notified = true;
|
| - if (ever_notified && !notified) return;
|
| -
|
| +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 && (notified || 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);
|
| @@ -639,7 +642,9 @@
|
| Shrink();
|
|
|
| Counters::objs_since_last_full.Set(0);
|
| - context_disposed_pending_ = false;
|
| +
|
| + contexts_disposed_ = 0;
|
| + context_disposed_deprecated_pending_ = false;
|
| }
|
|
|
|
|
| @@ -3088,6 +3093,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_) {
|
|
|