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