Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Unified Diff: src/profiler/heap-snapshot-generator.cc

Issue 2627033002: [profiler] Query retainer infos from embedder instead of using object grouping (Closed)
Patch Set: Rebase and fixes Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/profiler/heap-snapshot-generator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/profiler/heap-snapshot-generator.cc
diff --git a/src/profiler/heap-snapshot-generator.cc b/src/profiler/heap-snapshot-generator.cc
index c84892b069d6a7c28b3224136bbf35a6759fee0e..f62129726643d267bdf6fb0c790949c711eeb6a7 100644
--- a/src/profiler/heap-snapshot-generator.cc
+++ b/src/profiler/heap-snapshot-generator.cc
@@ -4,6 +4,8 @@
#include "src/profiler/heap-snapshot-generator.h"
+#include <utility>
+
#include "src/code-stubs.h"
#include "src/conversions.h"
#include "src/debug/debug.h"
@@ -2287,55 +2289,52 @@ int NativeObjectsExplorer::EstimateObjectsCount() {
void NativeObjectsExplorer::FillRetainedObjects() {
if (embedder_queried_) return;
- Isolate* isolate = isolate_;
- const GCType major_gc_type = kGCTypeMarkSweepCompact;
- // Record objects that are joined into ObjectGroups.
- isolate->heap()->CallGCPrologueCallbacks(
- major_gc_type, kGCCallbackFlagConstructRetainedObjectInfos);
- List<ObjectGroup*>* groups = isolate->global_handles()->object_groups();
- for (int i = 0; i < groups->length(); ++i) {
- ObjectGroup* group = groups->at(i);
- if (group->info == NULL) continue;
- List<HeapObject*>* list = GetListMaybeDisposeInfo(group->info);
- for (size_t j = 0; j < group->length; ++j) {
- HeapObject* obj = HeapObject::cast(*group->objects[j]);
- list->Add(obj);
- in_groups_.Insert(obj);
+ v8::HandleScope scope(reinterpret_cast<v8::Isolate*>(isolate_));
+ v8::HeapProfiler::RetainerInfos infos =
+ snapshot_->profiler()->GetRetainerInfos(isolate_);
+ for (auto& pair : infos.groups) {
+ List<HeapObject*>* list = GetListMaybeDisposeInfo(pair.first);
+ for (auto& persistent : pair.second) {
+ if (persistent->IsEmpty()) continue;
+
+ Handle<Object> object = v8::Utils::OpenHandle(
+ *persistent->Get(reinterpret_cast<v8::Isolate*>(isolate_)));
+ DCHECK(!object.is_null());
+ HeapObject* heap_object = HeapObject::cast(*object);
+ list->Add(heap_object);
+ in_groups_.Insert(heap_object);
}
- group->info = NULL; // Acquire info object ownership.
}
- isolate->global_handles()->RemoveObjectGroups();
- isolate->heap()->CallGCEpilogueCallbacks(major_gc_type, kNoGCCallbackFlags);
+
// Record objects that are not in ObjectGroups, but have class ID.
GlobalHandlesExtractor extractor(this);
- isolate->global_handles()->IterateAllRootsWithClassIds(&extractor);
+ isolate_->global_handles()->IterateAllRootsWithClassIds(&extractor);
+
+ edges_ = std::move(infos.edges);
embedder_queried_ = true;
}
+void NativeObjectsExplorer::FillEdges() {
+ v8::HandleScope scope(reinterpret_cast<v8::Isolate*>(isolate_));
+ // Fill in actual edges found.
+ for (auto& pair : edges_) {
+ if (pair.first->IsEmpty() || pair.second->IsEmpty()) continue;
-void NativeObjectsExplorer::FillImplicitReferences() {
- Isolate* isolate = isolate_;
- List<ImplicitRefGroup*>* groups =
- isolate->global_handles()->implicit_ref_groups();
- for (int i = 0; i < groups->length(); ++i) {
- ImplicitRefGroup* group = groups->at(i);
- HeapObject* parent = *group->parent;
+ Handle<Object> parent_object = v8::Utils::OpenHandle(
+ *pair.first->Get(reinterpret_cast<v8::Isolate*>(isolate_)));
+ HeapObject* parent = HeapObject::cast(*parent_object);
int parent_entry =
filler_->FindOrAddEntry(parent, native_entries_allocator_)->index();
DCHECK(parent_entry != HeapEntry::kNoEntry);
- Object*** children = group->children;
- for (size_t j = 0; j < group->length; ++j) {
- Object* child = *children[j];
- HeapEntry* child_entry =
- filler_->FindOrAddEntry(child, native_entries_allocator_);
- filler_->SetNamedReference(
- HeapGraphEdge::kInternal,
- parent_entry,
- "native",
- child_entry);
- }
+ Handle<Object> child_object = v8::Utils::OpenHandle(
+ *pair.second->Get(reinterpret_cast<v8::Isolate*>(isolate_)));
+ HeapObject* child = HeapObject::cast(*child_object);
+ HeapEntry* child_entry =
+ filler_->FindOrAddEntry(child, native_entries_allocator_);
+ filler_->SetNamedReference(HeapGraphEdge::kInternal, parent_entry, "native",
+ child_entry);
}
- isolate->global_handles()->RemoveImplicitRefGroups();
+ edges_.clear();
}
List<HeapObject*>* NativeObjectsExplorer::GetListMaybeDisposeInfo(
@@ -2355,7 +2354,7 @@ bool NativeObjectsExplorer::IterateAndExtractReferences(
SnapshotFiller* filler) {
filler_ = filler;
FillRetainedObjects();
- FillImplicitReferences();
+ FillEdges();
if (EstimateObjectsCount() > 0) {
for (base::HashMap::Entry* p = objects_by_info_.Start(); p != NULL;
p = objects_by_info_.Next(p)) {
« no previous file with comments | « src/profiler/heap-snapshot-generator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698