| Index: src/heap/gc-tracer.cc
|
| diff --git a/src/heap/gc-tracer.cc b/src/heap/gc-tracer.cc
|
| index 046ac2cd225766d3f3a422df495c1ac37e13a1d9..c2f6ab6c9d04bde61c42df5d26f580731ca77ab5 100644
|
| --- a/src/heap/gc-tracer.cc
|
| +++ b/src/heap/gc-tracer.cc
|
| @@ -93,7 +93,8 @@ GCTracer::GCTracer(Heap* heap)
|
| longest_incremental_marking_step_(0.0),
|
| cumulative_marking_duration_(0.0),
|
| cumulative_sweeping_duration_(0.0),
|
| - new_space_top_after_gc_(0) {
|
| + new_space_top_after_gc_(0),
|
| + start_counter_(0) {
|
| current_ = Event(Event::START, NULL, NULL);
|
| current_.end_time = base::OS::TimeCurrentMillis();
|
| previous_ = previous_mark_compactor_event_ = current_;
|
| @@ -102,6 +103,9 @@ GCTracer::GCTracer(Heap* heap)
|
|
|
| void GCTracer::Start(GarbageCollector collector, const char* gc_reason,
|
| const char* collector_reason) {
|
| + start_counter_++;
|
| + if (start_counter_ != 1) return;
|
| +
|
| previous_ = current_;
|
| double start_time = base::OS::TimeCurrentMillis();
|
| if (new_space_top_after_gc_ != 0) {
|
| @@ -142,7 +146,22 @@ void GCTracer::Start(GarbageCollector collector, const char* gc_reason,
|
| }
|
|
|
|
|
| -void GCTracer::Stop() {
|
| +void GCTracer::Stop(GarbageCollector collector) {
|
| + start_counter_--;
|
| + if (start_counter_ != 0) {
|
| + if (FLAG_trace_gc) {
|
| + PrintF("[Finished reentrant %s during %s.]\n",
|
| + collector == SCAVENGER ? "Scavenge" : "Mark-sweep",
|
| + current_.TypeName(false));
|
| + }
|
| + return;
|
| + }
|
| +
|
| + DCHECK(start_counter_ >= 0);
|
| + DCHECK(
|
| + (collector == SCAVENGER && current_.type == Event::SCAVENGER) ||
|
| + (collector == MARK_COMPACTOR && current_.type == Event::MARK_COMPACTOR));
|
| +
|
| current_.end_time = base::OS::TimeCurrentMillis();
|
| current_.end_object_size = heap_->SizeOfObjects();
|
| current_.end_memory_size = heap_->isolate()->memory_allocator()->Size();
|
|
|