| Index: src/profile-generator.h
|
| ===================================================================
|
| --- src/profile-generator.h (revision 7006)
|
| +++ src/profile-generator.h (working copy)
|
| @@ -88,7 +88,6 @@
|
|
|
| class CodeEntry {
|
| public:
|
| - explicit INLINE(CodeEntry(int security_token_id));
|
| // CodeEntry doesn't own name strings, just references them.
|
| INLINE(CodeEntry(Logger::LogEventsAndTags tag,
|
| const char* name_prefix,
|
| @@ -103,6 +102,8 @@
|
| INLINE(const char* name() const) { return name_; }
|
| INLINE(const char* resource_name() const) { return resource_name_; }
|
| INLINE(int line_number() const) { return line_number_; }
|
| + INLINE(int shared_id() const) { return shared_id_; }
|
| + INLINE(void set_shared_id(int shared_id)) { shared_id_ = shared_id; }
|
| INLINE(int security_token_id() const) { return security_token_id_; }
|
|
|
| INLINE(static bool is_js_function_tag(Logger::LogEventsAndTags tag));
|
| @@ -119,6 +120,7 @@
|
| const char* name_;
|
| const char* resource_name_;
|
| int line_number_;
|
| + int shared_id_;
|
| int security_token_id_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(CodeEntry);
|
| @@ -234,12 +236,12 @@
|
|
|
| class CodeMap {
|
| public:
|
| - CodeMap() { }
|
| + CodeMap() : next_sfi_tag_(1) { }
|
| INLINE(void AddCode(Address addr, CodeEntry* entry, unsigned size));
|
| INLINE(void MoveCode(Address from, Address to));
|
| INLINE(void DeleteCode(Address addr));
|
| - void AddAlias(Address start, CodeEntry* entry, Address code_start);
|
| CodeEntry* FindEntry(Address addr);
|
| + int GetSFITag(Address addr);
|
|
|
| void Print();
|
|
|
| @@ -267,7 +269,11 @@
|
| void Call(const Address& key, const CodeEntryInfo& value);
|
| };
|
|
|
| + // Fake CodeEntry pointer to distinguish SFI entries.
|
| + static CodeEntry* const kSfiCodeEntry;
|
| +
|
| CodeTree tree_;
|
| + int next_sfi_tag_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(CodeMap);
|
| };
|
| @@ -675,14 +681,14 @@
|
|
|
| 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);
|
| @@ -695,15 +701,7 @@
|
| 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_;
|
| @@ -867,6 +865,20 @@
|
| };
|
|
|
|
|
| +// 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 {
|
| @@ -874,13 +886,12 @@
|
| HeapEntriesMap();
|
| ~HeapEntriesMap();
|
|
|
| - HeapEntry* Map(HeapObject* object);
|
| - void Pair(HeapObject* object, HeapEntry* entry);
|
| - void CountReference(HeapObject* from, HeapObject* to,
|
| + void AllocateEntries();
|
| + 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);
|
|
|
| int entries_count() { return entries_count_; }
|
| int total_children_count() { return total_children_count_; }
|
| @@ -890,18 +901,25 @@
|
|
|
| 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 HeapObjectsMatch(void* key1, void* key2) { return key1 == key2; }
|
| + static bool HeapThingsMatch(HeapThing key1, HeapThing key2) {
|
| + return key1 == key2;
|
| + }
|
|
|
| HashMap entries_;
|
| int entries_count_;
|
| @@ -928,52 +946,70 @@
|
| };
|
|
|
|
|
| -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();
|
|
|
| +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();
|
| + virtual HeapEntry* AllocateEntry(
|
| + HeapThing ptr, int children_count, int retainers_count);
|
| + void AddRootEntries(SnapshotFillerInterface* filler);
|
| + int EstimateObjectsCount();
|
| + bool IterateAndExtractReferences(SnapshotFillerInterface* filler);
|
| +
|
| private:
|
| - bool ApproximateRetainedSizes();
|
| - bool BuildDominatorTree(const Vector<HeapEntry*>& entries,
|
| - Vector<HeapEntry*>* dominators);
|
| - bool CountEntriesAndReferences();
|
| - HeapEntry* GetEntry(Object* obj);
|
| - void IncProgressCounter() { ++progress_counter_; }
|
| + 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 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();
|
| void SetClosureReference(HeapObject* parent_obj,
|
| HeapEntry* parent,
|
| String* reference_name,
|
| @@ -1005,24 +1041,54 @@
|
| void SetRootShortcutReference(Object* child);
|
| void SetRootGcRootsReference();
|
| void SetGcRootsReference(Object* child);
|
| - void SetProgressTotal(int iterations_count);
|
|
|
| + 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_;
|
| + 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_;
|
|
|
| - friend class IndexedReferencesExtractor;
|
| - friend class RootsReferencesExtractor;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(HeapSnapshotGenerator);
|
| };
|
|
|
|
|