Index: src/profile-generator.h |
diff --git a/src/profile-generator.h b/src/profile-generator.h |
index 049cc3b0e6e09bfccaa70daba222b77407366bd1..7f8ffbdba44b18f48e23cf9db717af4a17e6a468 100644 |
--- a/src/profile-generator.h |
+++ b/src/profile-generator.h |
@@ -528,12 +528,19 @@ class HeapEntry BASE_EMBEDDED { |
const char* name() { return name_; } |
uint64_t id() { return id_; } |
int self_size() { return self_size_; } |
+ int retained_size() { return retained_size_; } |
+ void add_retained_size(int size) { retained_size_ += size; } |
+ void set_retained_size(int value) { retained_size_ = value; } |
+ int ordered_index() { return ordered_index_; } |
+ void set_ordered_index(int value) { ordered_index_ = value; } |
Vector<HeapGraphEdge> children() { |
return Vector<HeapGraphEdge>(children_arr(), children_count_); } |
Vector<HeapGraphEdge*> retainers() { |
return Vector<HeapGraphEdge*>(retainers_arr(), retainers_count_); } |
List<HeapGraphPath*>* GetRetainingPaths(); |
+ HeapEntry* dominator() { return dominator_; } |
+ void set_dominator(HeapEntry* entry) { dominator_ = entry; } |
void clear_paint() { painted_ = kUnpainted; } |
bool painted_reachable() { return painted_ == kPainted; } |
@@ -551,6 +558,13 @@ class HeapEntry BASE_EMBEDDED { |
void ApplyAndPaintAllReachable(Visitor* visitor); |
void PaintAllReachable(); |
+ bool is_leaf() { return painted_ == kLeaf; } |
+ void set_leaf() { painted_ = kLeaf; } |
+ bool is_non_leaf() { return painted_ == kNonLeaf; } |
+ void set_non_leaf() { painted_ = kNonLeaf; } |
+ bool is_processed() { return painted_ == kProcessed; } |
+ void set_processed() { painted_ = kProcessed; } |
+ |
void SetIndexedReference(HeapGraphEdge::Type type, |
int child_index, |
int index, |
@@ -564,14 +578,19 @@ class HeapEntry BASE_EMBEDDED { |
void SetUnidirElementReference(int child_index, int index, HeapEntry* entry); |
int EntrySize() { return EntriesSize(1, children_count_, retainers_count_); } |
- int ReachableSize(); |
- int RetainedSize(); |
+ int RetainedSize(bool exact); |
+ List<HeapGraphPath*>* CalculateRetainingPaths(); |
void Print(int max_depth, int indent); |
static int EntriesSize(int entries_count, |
int children_count, |
int retainers_count); |
+ static uint32_t Hash(HeapEntry* entry) { |
+ return ComputeIntegerHash( |
+ static_cast<uint32_t>(reinterpret_cast<uintptr_t>(entry))); |
+ } |
+ static bool Match(void* entry1, void* entry2) { return entry1 == entry2; } |
private: |
HeapGraphEdge* children_arr() { |
@@ -580,53 +599,37 @@ class HeapEntry BASE_EMBEDDED { |
HeapGraphEdge** retainers_arr() { |
return reinterpret_cast<HeapGraphEdge**>(children_arr() + children_count_); |
} |
+ void CalculateExactRetainedSize(); |
+ void FindRetainingPaths(CachedHeapGraphPath* prev_path, |
+ List<HeapGraphPath*>* retaining_paths); |
const char* TypeAsString(); |
unsigned painted_: 2; |
unsigned type_: 3; |
- // The calculated data is stored in HeapSnapshot in HeapEntryCalculatedData |
- // entries. See AddCalculatedData and GetCalculatedData. |
- int calculated_data_index_: 27; |
- int self_size_; |
- int children_count_; |
+ int children_count_: 27; |
int retainers_count_; |
+ int self_size_; |
+ union { |
+ int ordered_index_; // Used during dominator tree building. |
+ int retained_size_; // At that moment, there is no retained size yet. |
+ }; |
+ HeapEntry* dominator_; |
HeapSnapshot* snapshot_; |
const char* name_; |
uint64_t id_; |
+ // Paints used for exact retained sizes calculation. |
static const unsigned kUnpainted = 0; |
static const unsigned kPainted = 1; |
static const unsigned kPaintedReachableFromOthers = 2; |
- static const int kNoCalculatedData = -1; |
- |
- DISALLOW_COPY_AND_ASSIGN(HeapEntry); |
-}; |
- |
+ // Paints used for approximate retained sizes calculation. |
+ static const unsigned kLeaf = 0; |
+ static const unsigned kNonLeaf = 1; |
+ static const unsigned kProcessed = 2; |
-class HeapEntryCalculatedData { |
- public: |
- HeapEntryCalculatedData() |
- : retaining_paths_(NULL), |
- reachable_size_(kUnknownSize), |
- retained_size_(kUnknownSize) { |
- } |
- void Dispose(); |
- |
- List<HeapGraphPath*>* GetRetainingPaths(HeapEntry* entry); |
- int ReachableSize(HeapEntry* entry); |
- int RetainedSize(HeapEntry* entry); |
- |
- private: |
- void CalculateSizes(HeapEntry* entry); |
- void FindRetainingPaths(HeapEntry* entry, CachedHeapGraphPath* prev_path); |
+ static const int kExactRetainedSizeTag = 1; |
- List<HeapGraphPath*>* retaining_paths_; |
- int reachable_size_; |
- int retained_size_; |
- |
- static const int kUnknownSize = -1; |
- |
- // Allow generated copy constructor and assignment operator. |
+ DISALLOW_COPY_AND_ASSIGN(HeapEntry); |
}; |
@@ -687,12 +690,10 @@ class HeapSnapshot { |
int size, |
int children_count, |
int retainers_count); |
- int AddCalculatedData(); |
- HeapEntryCalculatedData& GetCalculatedData(int index) { |
- return calculated_data_[index]; |
- } |
+ void ApproximateRetainedSizes(); |
void ClearPaint(); |
HeapSnapshotsDiff* CompareWith(HeapSnapshot* snapshot); |
+ List<HeapGraphPath*>* GetRetainingPaths(HeapEntry* entry); |
List<HeapEntry*>* GetSortedEntriesList(); |
template<class Visitor> |
void IterateEntries(Visitor* visitor) { entries_.Iterate(visitor); } |
@@ -710,6 +711,10 @@ class HeapSnapshot { |
int children_count, |
int retainers_count); |
HeapEntry* GetNextEntryToInit(); |
+ void BuildDominatorTree(const Vector<HeapEntry*>& entries, |
+ Vector<HeapEntry*>* dominators); |
+ void FillReversePostorderIndexes(Vector<HeapEntry*>* entries); |
+ void SetEntriesDominators(); |
HeapSnapshotsCollection* collection_; |
Type type_; |
@@ -720,7 +725,7 @@ class HeapSnapshot { |
char* raw_entries_; |
List<HeapEntry*> entries_; |
bool entries_sorted_; |
- List<HeapEntryCalculatedData> calculated_data_; |
+ HashMap retaining_paths_; |
#ifdef DEBUG |
int raw_entries_size_; |
#endif |