Index: src/profile-generator.h |
diff --git a/src/profile-generator.h b/src/profile-generator.h |
index 748714dc4d03d4a5a0e7f7c4cf3c09c89637b626..a92c6e2c669ab2ddd8d79949ada12f3126fc1dfb 100644 |
--- a/src/profile-generator.h |
+++ b/src/profile-generator.h |
@@ -681,14 +681,14 @@ class HeapSnapshot { |
void AllocateEntries( |
int entries_count, int children_count, int retainers_count); |
- HeapEntry* AddEntry( |
- HeapObject* object, int children_count, int retainers_count); |
HeapEntry* AddEntry(HeapEntry::Type type, |
const char* name, |
uint64_t id, |
int size, |
int children_count, |
int retainers_count); |
+ HeapEntry* AddRootEntry(int children_count); |
+ HeapEntry* AddGcRootsEntry(int children_count, int retainers_count); |
void ClearPaint(); |
HeapSnapshotsDiff* CompareWith(HeapSnapshot* snapshot); |
HeapEntry* GetEntryById(uint64_t id); |
@@ -701,15 +701,7 @@ class HeapSnapshot { |
void Print(int max_depth); |
void PrintEntriesSize(); |
- static HeapObject* const kInternalRootObject; |
- static HeapObject* const kGcRootsObject; |
- |
private: |
- HeapEntry* AddEntry(HeapObject* object, |
- HeapEntry::Type type, |
- const char* name, |
- int children_count, |
- int retainers_count); |
HeapEntry* GetNextEntryToInit(); |
HeapSnapshotsCollection* collection_; |
@@ -873,6 +865,20 @@ class HeapSnapshotsCollection { |
}; |
+// A typedef for referencing anything that can be snapshotted living |
+// in any kind of heap memory. |
+typedef void* HeapThing; |
+ |
+ |
+// An interface that creates HeapEntries by HeapThings. |
+class HeapEntriesAllocator { |
+ public: |
+ virtual ~HeapEntriesAllocator() { } |
+ virtual HeapEntry* AllocateEntry( |
+ HeapThing ptr, int children_count, int retainers_count) = 0; |
+}; |
+ |
+ |
// The HeapEntriesMap instance is used to track a mapping between |
// real heap objects and their representations in heap snapshots. |
class HeapEntriesMap { |
Vitaly Repeshko
2011/03/01 16:55:51
Consider refactoring it into a simple HeapThing->E
mnaganov (inactive)
2011/03/01 17:35:41
Thanks, but let me postpone it.
|
@@ -880,13 +886,12 @@ class HeapEntriesMap { |
HeapEntriesMap(); |
~HeapEntriesMap(); |
- HeapEntry* Map(HeapObject* object); |
- void Pair(HeapObject* object, HeapEntry* entry); |
- void CountReference(HeapObject* from, HeapObject* to, |
+ HeapEntry* Map(HeapThing thing); |
+ void Pair(HeapThing thing, HeapEntriesAllocator* allocator, HeapEntry* entry); |
+ void CountReference(HeapThing from, HeapThing to, |
int* prev_children_count = NULL, |
int* prev_retainers_count = NULL); |
- template<class Visitor> |
- void UpdateEntries(Visitor* visitor); |
+ void UpdateEntries(); |
Vitaly Repeshko
2011/03/01 16:55:51
The name is confusing. It's supposed to be called
mnaganov (inactive)
2011/03/01 17:35:41
Renamed to AllocateEntries -- this should meet you
|
int entries_count() { return entries_count_; } |
int total_children_count() { return total_children_count_; } |
@@ -896,18 +901,25 @@ class HeapEntriesMap { |
private: |
struct EntryInfo { |
- explicit EntryInfo(HeapEntry* entry) |
- : entry(entry), children_count(0), retainers_count(0) { } |
+ EntryInfo(HeapEntry* entry, HeapEntriesAllocator* allocator) |
+ : entry(entry), |
+ allocator(allocator), |
+ children_count(0), |
+ retainers_count(0) { |
+ } |
HeapEntry* entry; |
+ HeapEntriesAllocator* allocator; |
int children_count; |
int retainers_count; |
}; |
- static uint32_t Hash(HeapObject* object) { |
+ static uint32_t Hash(HeapThing thing) { |
return ComputeIntegerHash( |
- static_cast<uint32_t>(reinterpret_cast<uintptr_t>(object))); |
+ static_cast<uint32_t>(reinterpret_cast<uintptr_t>(thing))); |
+ } |
+ static bool HeapThingsMatch(HeapThing key1, HeapThing key2) { |
+ return key1 == key2; |
} |
- static bool HeapObjectsMatch(void* key1, void* key2) { return key1 == key2; } |
HashMap entries_; |
int entries_count_; |
@@ -934,52 +946,69 @@ class HeapObjectsSet { |
}; |
-class HeapSnapshotGenerator { |
+// An interface used to populate a snapshot with nodes and edges. |
+class SnapshotFillerInterface { |
public: |
- class SnapshotFillerInterface { |
- public: |
- virtual ~SnapshotFillerInterface() { } |
- virtual HeapEntry* AddEntry(HeapObject* obj) = 0; |
- virtual void SetIndexedReference(HeapGraphEdge::Type type, |
- HeapObject* parent_obj, |
- HeapEntry* parent_entry, |
- int index, |
- Object* child_obj, |
- HeapEntry* child_entry) = 0; |
- virtual void SetNamedReference(HeapGraphEdge::Type type, |
- HeapObject* parent_obj, |
+ virtual ~SnapshotFillerInterface() { } |
+ virtual HeapEntry* AddEntry(HeapThing ptr) = 0; |
+ virtual HeapEntry* FindOrAddEntry(HeapThing ptr) = 0; |
+ virtual void SetIndexedReference(HeapGraphEdge::Type type, |
+ HeapThing parent_ptr, |
HeapEntry* parent_entry, |
- const char* reference_name, |
- Object* child_obj, |
+ int index, |
+ HeapThing child_ptr, |
HeapEntry* child_entry) = 0; |
- virtual void SetRootGcRootsReference() = 0; |
- virtual void SetRootShortcutReference(Object* child_obj, |
+ virtual void SetIndexedAutoIndexReference(HeapGraphEdge::Type type, |
+ HeapThing parent_ptr, |
+ HeapEntry* parent_entry, |
+ HeapThing child_ptr, |
+ HeapEntry* child_entry) = 0; |
+ virtual void SetNamedReference(HeapGraphEdge::Type type, |
+ HeapThing parent_ptr, |
+ HeapEntry* parent_entry, |
+ const char* reference_name, |
+ HeapThing child_ptr, |
+ HeapEntry* child_entry) = 0; |
+ virtual void SetNamedAutoIndexReference(HeapGraphEdge::Type type, |
+ HeapThing parent_ptr, |
+ HeapEntry* parent_entry, |
+ HeapThing child_ptr, |
HeapEntry* child_entry) = 0; |
- virtual void SetStrongRootReference(Object* child_obj, |
- HeapEntry* child_entry) = 0; |
- }; |
+}; |
- HeapSnapshotGenerator(HeapSnapshot* snapshot, |
- v8::ActivityControl* control); |
- bool GenerateSnapshot(); |
- private: |
- bool ApproximateRetainedSizes(); |
- bool BuildDominatorTree(const Vector<HeapEntry*>& entries, |
- Vector<HeapEntry*>* dominators); |
- bool CountEntriesAndReferences(); |
- HeapEntry* GetEntry(Object* obj); |
- void IncProgressCounter() { ++progress_counter_; } |
+class SnapshottingProgressReportingInterface { |
+ public: |
+ virtual ~SnapshottingProgressReportingInterface() { } |
+ virtual void ProgressStep() = 0; |
+ virtual bool ProgressReport(bool force) = 0; |
+}; |
+ |
+ |
+// An implementation of V8 heap graph extractor. |
+class V8HeapExplorer : public HeapEntriesAllocator { |
+ public: |
+ V8HeapExplorer(HeapSnapshot* snapshot, |
+ SnapshottingProgressReportingInterface* progress); |
+ ~V8HeapExplorer(); |
+ HeapEntry* AllocateEntry( |
Vitaly Repeshko
2011/03/01 16:55:51
It seems weird to have both AllocateEntry and AddE
mnaganov (inactive)
2011/03/01 17:35:41
Marked AllocateEntry as virtual.
Also, I made priv
|
+ HeapThing ptr, int children_count, int retainers_count); |
+ |
+ HeapEntry* AddEntry( |
+ HeapObject* object, int children_count, int retainers_count); |
+ HeapEntry* AddEntry(HeapObject* object, |
+ HeapEntry::Type type, |
+ const char* name, |
+ int children_count, |
+ int retainers_count); |
+ void AddRootEntries(SnapshotFillerInterface* filler); |
void ExtractReferences(HeapObject* obj); |
void ExtractClosureReferences(JSObject* js_obj, HeapEntry* entry); |
void ExtractPropertyReferences(JSObject* js_obj, HeapEntry* entry); |
void ExtractElementReferences(JSObject* js_obj, HeapEntry* entry); |
void ExtractInternalReferences(JSObject* js_obj, HeapEntry* entry); |
- bool FillReferences(); |
- void FillReversePostorderIndexes(Vector<HeapEntry*>* entries); |
- bool IterateAndExtractReferences(); |
- inline bool ReportProgress(bool force = false); |
- bool SetEntriesDominators(); |
+ int EstimateObjectsCount(); |
+ bool IterateAndExtractReferences(SnapshotFillerInterface* filler); |
void SetClosureReference(HeapObject* parent_obj, |
HeapEntry* parent, |
String* reference_name, |
@@ -1011,24 +1040,55 @@ class HeapSnapshotGenerator { |
void SetRootShortcutReference(Object* child); |
void SetRootGcRootsReference(); |
void SetGcRootsReference(Object* child); |
- void SetProgressTotal(int iterations_count); |
+ |
+ private: |
+ HeapEntry* GetEntry(Object* obj); |
HeapSnapshot* snapshot_; |
- v8::ActivityControl* control_; |
HeapSnapshotsCollection* collection_; |
- // Mapping from HeapObject* pointers to HeapEntry* pointers. |
- HeapEntriesMap entries_; |
- SnapshotFillerInterface* filler_; |
+ SnapshottingProgressReportingInterface* progress_; |
// Used during references extraction to mark heap objects that |
// are references via non-hidden properties. |
HeapObjectsSet known_references_; |
- // Used during snapshot generation. |
- int progress_counter_; |
- int progress_total_; |
+ SnapshotFillerInterface* filler_; |
+ |
+ static HeapObject* const kInternalRootObject; |
+ static HeapObject* const kGcRootsObject; |
friend class IndexedReferencesExtractor; |
friend class RootsReferencesExtractor; |
+ DISALLOW_COPY_AND_ASSIGN(V8HeapExplorer); |
+}; |
+ |
+ |
+class HeapSnapshotGenerator : public SnapshottingProgressReportingInterface { |
+ public: |
+ HeapSnapshotGenerator(HeapSnapshot* snapshot, |
+ v8::ActivityControl* control); |
+ bool GenerateSnapshot(); |
+ |
+ private: |
+ bool ApproximateRetainedSizes(); |
+ bool BuildDominatorTree(const Vector<HeapEntry*>& entries, |
+ Vector<HeapEntry*>* dominators); |
+ bool CountEntriesAndReferences(); |
+ bool FillReferences(); |
+ void FillReversePostorderIndexes(Vector<HeapEntry*>* entries); |
+ void ProgressStep(); |
+ bool ProgressReport(bool force = false); |
+ bool SetEntriesDominators(); |
+ void SetProgressTotal(int iterations_count); |
+ |
+ HeapSnapshot* snapshot_; |
+ v8::ActivityControl* control_; |
+ V8HeapExplorer v8_heap_explorer_; |
+ // Mapping from HeapThing pointers to HeapEntry* pointers. |
+ HeapEntriesMap entries_; |
+ // Used during snapshot generation. |
+ int progress_counter_; |
+ int progress_total_; |
+ |
DISALLOW_COPY_AND_ASSIGN(HeapSnapshotGenerator); |
}; |