Index: src/heap/incremental-marking.cc |
diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc |
index a85d4a8489326ec84afcd2ca4191d45ebdda18fe..abca37ee408aa8d105c22c32e2f464ecc13b15ec 100644 |
--- a/src/heap/incremental-marking.cc |
+++ b/src/heap/incremental-marking.cc |
@@ -28,7 +28,8 @@ IncrementalMarking::IncrementalMarking(Heap* heap) |
idle_marking_delay_counter_(0), |
no_marking_scope_depth_(0), |
unscanned_bytes_of_large_object_(0), |
- was_activated_(false) {} |
+ was_activated_(false), |
+ weak_closure_was_overapproximated_(false) {} |
void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot, |
@@ -495,6 +496,7 @@ void IncrementalMarking::Start(CompactionFlag flag) { |
ResetStepCounters(); |
was_activated_ = true; |
+ weak_closure_was_overapproximated_ = false; |
Hannes Payer (out of office)
2015/02/03 17:40:11
Can we do that in the gc epilogue?
jochen (gone - plz use gerrit)
2015/02/09 16:03:43
Done
|
if (!heap_->mark_compact_collector()->sweeping_in_progress()) { |
StartMarking(flag); |
@@ -772,13 +774,22 @@ void IncrementalMarking::Finalize() { |
void IncrementalMarking::MarkingComplete(CompletionAction action) { |
- state_ = COMPLETE; |
// We will set the stack guard to request a GC now. This will mean the rest |
// of the GC gets performed as soon as possible (we can't do a GC here in a |
// record-write context). If a few things get allocated between now and then |
// that shouldn't make us do a scavenge and keep being incremental, so we set |
// the should-hurry flag to indicate that there can't be much work left to do. |
set_should_hurry(true); |
+ if (FLAG_overapproximate_weak_closure && |
+ !weak_closure_was_overapproximated_ && action == GC_VIA_STACK_GUARD) { |
+ if (FLAG_trace_incremental_marking) { |
Hannes Payer (out of office)
2015/02/03 17:40:11
Can we add a separate method for that and dispatch
jochen (gone - plz use gerrit)
2015/02/09 16:03:43
done
jochen (gone - plz use gerrit)
2015/02/09 16:03:43
done
|
+ PrintF( |
+ "[IncrementalMarking] requesting weak closure overapproximation.\n"); |
+ } |
+ heap_->isolate()->stack_guard()->RequestGC(); |
+ return; |
+ } |
+ state_ = COMPLETE; |
if (FLAG_trace_incremental_marking) { |
PrintF("[IncrementalMarking] Complete (normal).\n"); |
} |