Make GCTracer not reentrant.
authorhpayer <hpayer@chromium.org>
Wed, 26 Nov 2014 14:11:28 +0000 (06:11 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 26 Nov 2014 14:11:51 +0000 (14:11 +0000)
BUG=

Review URL: https://codereview.chromium.org/754023003

Cr-Commit-Position: refs/heads/master@{#25524}

src/heap/gc-tracer.cc
src/heap/gc-tracer.h
src/heap/heap.cc

index 046ac2c..c2f6ab6 100644 (file)
@@ -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();
index 04dac62..3ea1d72 100644 (file)
@@ -264,7 +264,7 @@ class GCTracer {
              const char* collector_reason);
 
   // Stop collecting data and print results.
-  void Stop();
+  void Stop(GarbageCollector collector);
 
   // Log an allocation throughput event.
   void AddNewSpaceAllocationTime(double duration, intptr_t allocation_in_bytes);
@@ -419,6 +419,9 @@ class GCTracer {
   // collection.
   intptr_t new_space_top_after_gc_;
 
+  // Counts how many tracers were started without stopping.
+  int start_counter_;
+
   DISALLOW_COPY_AND_ASSIGN(GCTracer);
 };
 }
index 97c7d6d..e387193 100644 (file)
@@ -844,7 +844,7 @@ bool Heap::CollectGarbage(GarbageCollector collector, const char* gc_reason,
     }
 
     GarbageCollectionEpilogue();
-    tracer()->Stop();
+    tracer()->Stop(collector);
   }
 
   // Start incremental marking for the next cycle. The heap snapshot