Revision: 13486
Author:   [email protected]
Date:     Wed Jan 23 23:54:40 2013
Log:      Implicit references are missing in heap profiles
Review URL: https://codereview.chromium.org/11953043
http://code.google.com/p/v8/source/detail?r=13486

Modified:
 /branches/bleeding_edge/include/v8.h
 /branches/bleeding_edge/src/heap.cc
 /branches/bleeding_edge/src/heap.h
 /branches/bleeding_edge/src/profile-generator.cc
 /branches/bleeding_edge/test/cctest/test-heap-profiler.cc

=======================================
--- /branches/bleeding_edge/include/v8.h        Wed Jan 23 04:04:55 2013
+++ /branches/bleeding_edge/include/v8.h        Wed Jan 23 23:54:40 2013
@@ -3216,7 +3216,7 @@
    * or delete properties for example) since it is possible such
    * operations will result in the allocation of objects.
    */
-  static void SetGlobalGCPrologueCallback(GCCallback);
+  V8_DEPRECATED(static void SetGlobalGCPrologueCallback(GCCallback));

   /**
    * Enables the host application to receive a notification after a
@@ -3245,7 +3245,7 @@
    * or delete properties for example) since it is possible such
    * operations will result in the allocation of objects.
    */
-  static void SetGlobalGCEpilogueCallback(GCCallback);
+  V8_DEPRECATED(static void SetGlobalGCEpilogueCallback(GCCallback));

   /**
    * Enables the host application to provide a mechanism to be notified
=======================================
--- /branches/bleeding_edge/src/heap.cc Fri Jan 18 05:05:03 2013
+++ /branches/bleeding_edge/src/heap.cc Wed Jan 23 23:54:40 2013
@@ -882,24 +882,13 @@
   }
 #endif

-  if (collector == MARK_COMPACTOR && global_gc_prologue_callback_) {
-    ASSERT(!allocation_allowed_);
-    GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
-    VMState state(isolate_, EXTERNAL);
-    global_gc_prologue_callback_();
-  }
-
   GCType gc_type =
collector == MARK_COMPACTOR ? kGCTypeMarkSweepCompact : kGCTypeScavenge;

   {
     GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
     VMState state(isolate_, EXTERNAL);
-    for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) {
-      if (gc_type & gc_prologue_callbacks_[i].gc_type) {
-        gc_prologue_callbacks_[i].callback(gc_type, kNoGCCallbackFlags);
-      }
-    }
+    CallGCPrologueCallbacks(gc_type);
   }

   EnsureFromSpaceIsCommitted();
@@ -1009,19 +998,7 @@
   {
     GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
     VMState state(isolate_, EXTERNAL);
-    GCCallbackFlags callback_flags = kNoGCCallbackFlags;
-    for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) {
-      if (gc_type & gc_epilogue_callbacks_[i].gc_type) {
-        gc_epilogue_callbacks_[i].callback(gc_type, callback_flags);
-      }
-    }
-  }
-
-  if (collector == MARK_COMPACTOR && global_gc_epilogue_callback_) {
-    ASSERT(!allocation_allowed_);
-    GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
-    VMState state(isolate_, EXTERNAL);
-    global_gc_epilogue_callback_();
+    CallGCEpilogueCallbacks(gc_type);
   }

 #ifdef VERIFY_HEAP
@@ -1032,6 +1009,30 @@

   return next_gc_likely_to_collect_more;
 }
+
+
+void Heap::CallGCPrologueCallbacks(GCType gc_type) {
+  if (gc_type == kGCTypeMarkSweepCompact && global_gc_prologue_callback_) {
+    global_gc_prologue_callback_();
+  }
+  for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) {
+    if (gc_type & gc_prologue_callbacks_[i].gc_type) {
+      gc_prologue_callbacks_[i].callback(gc_type, kNoGCCallbackFlags);
+    }
+  }
+}
+
+
+void Heap::CallGCEpilogueCallbacks(GCType gc_type) {
+  for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) {
+    if (gc_type & gc_epilogue_callbacks_[i].gc_type) {
+      gc_epilogue_callbacks_[i].callback(gc_type, kNoGCCallbackFlags);
+    }
+  }
+  if (gc_type == kGCTypeMarkSweepCompact && global_gc_epilogue_callback_) {
+    global_gc_epilogue_callback_();
+  }
+}


 void Heap::MarkCompact(GCTracer* tracer) {
@@ -1376,6 +1377,7 @@
     new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
   }
   isolate()->global_handles()->RemoveObjectGroups();
+  isolate()->global_handles()->RemoveImplicitRefGroups();

   isolate_->global_handles()->IdentifyNewSpaceWeakIndependentHandles(
       &IsUnscavengedHeapObject);
=======================================
--- /branches/bleeding_edge/src/heap.h  Thu Jan 17 00:41:27 2013
+++ /branches/bleeding_edge/src/heap.h  Wed Jan 23 23:54:40 2013
@@ -1638,13 +1638,8 @@

   inline Isolate* isolate();

-  inline void CallGlobalGCPrologueCallback() {
- if (global_gc_prologue_callback_ != NULL) global_gc_prologue_callback_();
-  }
-
-  inline void CallGlobalGCEpilogueCallback() {
- if (global_gc_epilogue_callback_ != NULL) global_gc_epilogue_callback_();
-  }
+  void CallGCPrologueCallbacks(GCType gc_type);
+  void CallGCEpilogueCallbacks(GCType gc_type);

   inline bool OldGenerationAllocationLimitReached();

=======================================
--- /branches/bleeding_edge/src/profile-generator.cc Wed Dec 19 05:27:20 2012 +++ /branches/bleeding_edge/src/profile-generator.cc Wed Jan 23 23:54:40 2013
@@ -2826,8 +2826,9 @@
 void NativeObjectsExplorer::FillRetainedObjects() {
   if (embedder_queried_) return;
   Isolate* isolate = Isolate::Current();
+  const GCType major_gc_type = kGCTypeMarkSweepCompact;
   // Record objects that are joined into ObjectGroups.
-  isolate->heap()->CallGlobalGCPrologueCallback();
+  isolate->heap()->CallGCPrologueCallbacks(major_gc_type);
   List<ObjectGroup*>* groups = isolate->global_handles()->object_groups();
   for (int i = 0; i < groups->length(); ++i) {
     ObjectGroup* group = groups->at(i);
@@ -2841,7 +2842,7 @@
     group->info_ = NULL;  // Acquire info object ownership.
   }
   isolate->global_handles()->RemoveObjectGroups();
-  isolate->heap()->CallGlobalGCEpilogueCallback();
+  isolate->heap()->CallGCEpilogueCallbacks(major_gc_type);
   // Record objects that are not in ObjectGroups, but have class ID.
   GlobalHandlesExtractor extractor(this);
   isolate->global_handles()->IterateAllRootsWithClassIds(&extractor);
@@ -2870,6 +2871,7 @@
           child_entry);
     }
   }
+  isolate->global_handles()->RemoveImplicitRefGroups();
 }

 List<HeapObject*>* NativeObjectsExplorer::GetListMaybeDisposeInfo(
=======================================
--- /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Wed Dec 12 01:49:46 2012 +++ /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Wed Jan 23 23:54:40 2013
@@ -1116,7 +1116,7 @@
     instance_ = NULL;
   }

-  static void gcPrologue() {
+  static void gcPrologue(v8::GCType type, v8::GCCallbackFlags flags) {
     instance_->AddImplicitReferences();
   }

@@ -1142,7 +1142,7 @@
   LocalContext env;

   GraphWithImplicitRefs graph(&env);
-  v8::V8::SetGlobalGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue);
+  v8::V8::AddGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue);

   const v8::HeapSnapshot* snapshot =
       v8::HeapProfiler::TakeSnapshot(v8_str("implicit_refs"));
@@ -1165,7 +1165,7 @@
     }
   }
   CHECK_EQ(2, implicit_targets_count);
-  v8::V8::SetGlobalGCPrologueCallback(NULL);
+  v8::V8::RemoveGCPrologueCallback(&GraphWithImplicitRefs::gcPrologue);
 }


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev


Reply via email to