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

Side by Side Diff: src/profile-generator.h

Issue 8716009: Distinguish weak references in heap snapshots, group GC roots. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 class HeapEntry; 448 class HeapEntry;
449 449
450 class HeapGraphEdge BASE_EMBEDDED { 450 class HeapGraphEdge BASE_EMBEDDED {
451 public: 451 public:
452 enum Type { 452 enum Type {
453 kContextVariable = v8::HeapGraphEdge::kContextVariable, 453 kContextVariable = v8::HeapGraphEdge::kContextVariable,
454 kElement = v8::HeapGraphEdge::kElement, 454 kElement = v8::HeapGraphEdge::kElement,
455 kProperty = v8::HeapGraphEdge::kProperty, 455 kProperty = v8::HeapGraphEdge::kProperty,
456 kInternal = v8::HeapGraphEdge::kInternal, 456 kInternal = v8::HeapGraphEdge::kInternal,
457 kHidden = v8::HeapGraphEdge::kHidden, 457 kHidden = v8::HeapGraphEdge::kHidden,
458 kShortcut = v8::HeapGraphEdge::kShortcut 458 kShortcut = v8::HeapGraphEdge::kShortcut,
459 kWeak = v8::HeapGraphEdge::kWeak
459 }; 460 };
460 461
461 HeapGraphEdge() { } 462 HeapGraphEdge() { }
462 void Init(int child_index, Type type, const char* name, HeapEntry* to); 463 void Init(int child_index, Type type, const char* name, HeapEntry* to);
463 void Init(int child_index, Type type, int index, HeapEntry* to); 464 void Init(int child_index, Type type, int index, HeapEntry* to);
464 void Init(int child_index, int index, HeapEntry* to); 465 void Init(int child_index, int index, HeapEntry* to);
465 466
466 Type type() { return static_cast<Type>(type_); } 467 Type type() { return static_cast<Type>(type_); }
467 int index() { 468 int index() {
468 ASSERT(type_ == kElement || type_ == kHidden); 469 ASSERT(type_ == kElement || type_ == kHidden || type_ == kWeak);
469 return index_; 470 return index_;
470 } 471 }
471 const char* name() { 472 const char* name() {
472 ASSERT(type_ == kContextVariable 473 ASSERT(type_ == kContextVariable
473 || type_ == kProperty 474 || type_ == kProperty
474 || type_ == kInternal 475 || type_ == kInternal
475 || type_ == kShortcut); 476 || type_ == kShortcut);
476 return name_; 477 return name_;
477 } 478 }
478 HeapEntry* to() { return to_; } 479 HeapEntry* to() { return to_; }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 void SetNamedReference(HeapGraphEdge::Type type, 582 void SetNamedReference(HeapGraphEdge::Type type,
582 int child_index, 583 int child_index,
583 const char* name, 584 const char* name,
584 HeapEntry* entry, 585 HeapEntry* entry,
585 int retainer_index); 586 int retainer_index);
586 void SetUnidirElementReference(int child_index, int index, HeapEntry* entry); 587 void SetUnidirElementReference(int child_index, int index, HeapEntry* entry);
587 588
588 int EntrySize() { return EntriesSize(1, children_count_, retainers_count_); } 589 int EntrySize() { return EntriesSize(1, children_count_, retainers_count_); }
589 int RetainedSize(bool exact); 590 int RetainedSize(bool exact);
590 591
591 void Print(int max_depth, int indent); 592 void Print(
593 const char* prefix, const char* edge_name, int max_depth, int indent);
592 594
593 Handle<HeapObject> GetHeapObject(); 595 Handle<HeapObject> GetHeapObject();
594 596
595 static int EntriesSize(int entries_count, 597 static int EntriesSize(int entries_count,
596 int children_count, 598 int children_count,
597 int retainers_count); 599 int retainers_count);
598 600
599 private: 601 private:
600 HeapGraphEdge* children_arr() { 602 HeapGraphEdge* children_arr() {
601 return reinterpret_cast<HeapGraphEdge*>(this + 1); 603 return reinterpret_cast<HeapGraphEdge*>(this + 1);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 ~HeapSnapshot(); 656 ~HeapSnapshot();
655 void Delete(); 657 void Delete();
656 658
657 HeapSnapshotsCollection* collection() { return collection_; } 659 HeapSnapshotsCollection* collection() { return collection_; }
658 Type type() { return type_; } 660 Type type() { return type_; }
659 const char* title() { return title_; } 661 const char* title() { return title_; }
660 unsigned uid() { return uid_; } 662 unsigned uid() { return uid_; }
661 HeapEntry* root() { return root_entry_; } 663 HeapEntry* root() { return root_entry_; }
662 HeapEntry* gc_roots() { return gc_roots_entry_; } 664 HeapEntry* gc_roots() { return gc_roots_entry_; }
663 HeapEntry* natives_root() { return natives_root_entry_; } 665 HeapEntry* natives_root() { return natives_root_entry_; }
666 HeapEntry* gc_subroot(int index) { return gc_subroot_entries_[index]; }
664 List<HeapEntry*>* entries() { return &entries_; } 667 List<HeapEntry*>* entries() { return &entries_; }
665 int raw_entries_size() { return raw_entries_size_; } 668 int raw_entries_size() { return raw_entries_size_; }
666 669
667 void AllocateEntries( 670 void AllocateEntries(
668 int entries_count, int children_count, int retainers_count); 671 int entries_count, int children_count, int retainers_count);
669 HeapEntry* AddEntry(HeapEntry::Type type, 672 HeapEntry* AddEntry(HeapEntry::Type type,
670 const char* name, 673 const char* name,
671 uint64_t id, 674 uint64_t id,
672 int size, 675 int size,
673 int children_count, 676 int children_count,
674 int retainers_count); 677 int retainers_count);
675 HeapEntry* AddRootEntry(int children_count); 678 HeapEntry* AddRootEntry(int children_count);
676 HeapEntry* AddGcRootsEntry(int children_count, int retainers_count); 679 HeapEntry* AddGcRootsEntry(int children_count, int retainers_count);
680 HeapEntry* AddGcSubrootEntry(int tag,
681 int children_count,
682 int retainers_count);
677 HeapEntry* AddNativesRootEntry(int children_count, int retainers_count); 683 HeapEntry* AddNativesRootEntry(int children_count, int retainers_count);
678 void ClearPaint(); 684 void ClearPaint();
679 HeapEntry* GetEntryById(uint64_t id); 685 HeapEntry* GetEntryById(uint64_t id);
680 List<HeapEntry*>* GetSortedEntriesList(); 686 List<HeapEntry*>* GetSortedEntriesList();
681 template<class Visitor> 687 template<class Visitor>
682 void IterateEntries(Visitor* visitor) { entries_.Iterate(visitor); } 688 void IterateEntries(Visitor* visitor) { entries_.Iterate(visitor); }
683 void SetDominatorsToSelf(); 689 void SetDominatorsToSelf();
684 690
685 void Print(int max_depth); 691 void Print(int max_depth);
686 void PrintEntriesSize(); 692 void PrintEntriesSize();
687 693
688 private: 694 private:
689 HeapEntry* GetNextEntryToInit(); 695 HeapEntry* GetNextEntryToInit();
690 696
691 HeapSnapshotsCollection* collection_; 697 HeapSnapshotsCollection* collection_;
692 Type type_; 698 Type type_;
693 const char* title_; 699 const char* title_;
694 unsigned uid_; 700 unsigned uid_;
695 HeapEntry* root_entry_; 701 HeapEntry* root_entry_;
696 HeapEntry* gc_roots_entry_; 702 HeapEntry* gc_roots_entry_;
697 HeapEntry* natives_root_entry_; 703 HeapEntry* natives_root_entry_;
704 HeapEntry* gc_subroot_entries_[VisitorSynchronization::kNumberOfSyncTags];
698 char* raw_entries_; 705 char* raw_entries_;
699 List<HeapEntry*> entries_; 706 List<HeapEntry*> entries_;
700 bool entries_sorted_; 707 bool entries_sorted_;
701 int raw_entries_size_; 708 int raw_entries_size_;
702 709
703 friend class HeapSnapshotTester; 710 friend class HeapSnapshotTester;
704 711
705 DISALLOW_COPY_AND_ASSIGN(HeapSnapshot); 712 DISALLOW_COPY_AND_ASSIGN(HeapSnapshot);
706 }; 713 };
707 714
708 715
709 class HeapObjectsMap { 716 class HeapObjectsMap {
710 public: 717 public:
711 HeapObjectsMap(); 718 HeapObjectsMap();
712 ~HeapObjectsMap(); 719 ~HeapObjectsMap();
713 720
714 void SnapshotGenerationFinished(); 721 void SnapshotGenerationFinished();
715 uint64_t FindObject(Address addr); 722 uint64_t FindObject(Address addr);
716 void MoveObject(Address from, Address to); 723 void MoveObject(Address from, Address to);
717 724
718 static uint64_t GenerateId(v8::RetainedObjectInfo* info); 725 static uint64_t GenerateId(v8::RetainedObjectInfo* info);
726 static inline uint64_t GetNthGcSubrootId(int delta);
719 727
728 static const int kObjectIdStep = 2;
720 static const uint64_t kInternalRootObjectId; 729 static const uint64_t kInternalRootObjectId;
721 static const uint64_t kGcRootsObjectId; 730 static const uint64_t kGcRootsObjectId;
722 static const uint64_t kNativesRootObjectId; 731 static const uint64_t kNativesRootObjectId;
732 static const uint64_t kGcRootsFirstSubrootId;
723 static const uint64_t kFirstAvailableObjectId; 733 static const uint64_t kFirstAvailableObjectId;
724 734
725 private: 735 private:
726 struct EntryInfo { 736 struct EntryInfo {
727 explicit EntryInfo(uint64_t id) : id(id), accessed(true) { } 737 explicit EntryInfo(uint64_t id) : id(id), accessed(true) { }
728 EntryInfo(uint64_t id, bool accessed) : id(id), accessed(accessed) { } 738 EntryInfo(uint64_t id, bool accessed) : id(id), accessed(accessed) { }
729 uint64_t id; 739 uint64_t id;
730 bool accessed; 740 bool accessed;
731 }; 741 };
732 742
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 int field_offset = -1); 972 int field_offset = -1);
963 void SetInternalReference(HeapObject* parent_obj, 973 void SetInternalReference(HeapObject* parent_obj,
964 HeapEntry* parent, 974 HeapEntry* parent,
965 int index, 975 int index,
966 Object* child, 976 Object* child,
967 int field_offset = -1); 977 int field_offset = -1);
968 void SetHiddenReference(HeapObject* parent_obj, 978 void SetHiddenReference(HeapObject* parent_obj,
969 HeapEntry* parent, 979 HeapEntry* parent,
970 int index, 980 int index,
971 Object* child); 981 Object* child);
982 void SetWeakReference(HeapObject* parent_obj,
983 HeapEntry* parent_entry,
984 int index,
985 Object* child_obj,
986 int field_offset);
972 void SetPropertyReference(HeapObject* parent_obj, 987 void SetPropertyReference(HeapObject* parent_obj,
973 HeapEntry* parent, 988 HeapEntry* parent,
974 String* reference_name, 989 String* reference_name,
975 Object* child, 990 Object* child,
976 const char* name_format_string = NULL, 991 const char* name_format_string = NULL,
977 int field_offset = -1); 992 int field_offset = -1);
978 void SetPropertyShortcutReference(HeapObject* parent_obj, 993 void SetPropertyShortcutReference(HeapObject* parent_obj,
979 HeapEntry* parent, 994 HeapEntry* parent,
980 String* reference_name, 995 String* reference_name,
981 Object* child); 996 Object* child);
982 void SetRootShortcutReference(Object* child); 997 void SetRootShortcutReference(Object* child);
983 void SetRootGcRootsReference(); 998 void SetRootGcRootsReference();
984 void SetGcRootsReference(Object* child); 999 void SetGcRootsReference(VisitorSynchronization::SyncTag tag);
1000 void SetGcSubrootReference(
1001 VisitorSynchronization::SyncTag tag, bool is_weak, Object* child);
985 void TagObject(Object* obj, const char* tag); 1002 void TagObject(Object* obj, const char* tag);
986 1003
987 HeapEntry* GetEntry(Object* obj); 1004 HeapEntry* GetEntry(Object* obj);
988 1005
1006 static inline HeapObject* GetNthGcSubrootObject(int delta);
1007 static inline int GetGcSubrootOrder(HeapObject* subroot);
1008
989 Heap* heap_; 1009 Heap* heap_;
990 HeapSnapshot* snapshot_; 1010 HeapSnapshot* snapshot_;
991 HeapSnapshotsCollection* collection_; 1011 HeapSnapshotsCollection* collection_;
992 SnapshottingProgressReportingInterface* progress_; 1012 SnapshottingProgressReportingInterface* progress_;
993 SnapshotFillerInterface* filler_; 1013 SnapshotFillerInterface* filler_;
994 HeapObjectsSet objects_tags_; 1014 HeapObjectsSet objects_tags_;
995 1015
996 static HeapObject* const kGcRootsObject; 1016 static HeapObject* const kGcRootsObject;
1017 static HeapObject* const kFirstGcSubrootObject;
1018 static HeapObject* const kLastGcSubrootObject;
997 1019
998 friend class IndexedReferencesExtractor; 1020 friend class IndexedReferencesExtractor;
1021 friend class GcSubrootsEnumerator;
999 friend class RootsReferencesExtractor; 1022 friend class RootsReferencesExtractor;
1000 1023
1001 DISALLOW_COPY_AND_ASSIGN(V8HeapExplorer); 1024 DISALLOW_COPY_AND_ASSIGN(V8HeapExplorer);
1002 }; 1025 };
1003 1026
1004 1027
1005 // An implementation of retained native objects extractor. 1028 // An implementation of retained native objects extractor.
1006 class NativeObjectsExplorer : public HeapEntriesAllocator { 1029 class NativeObjectsExplorer : public HeapEntriesAllocator {
1007 public: 1030 public:
1008 NativeObjectsExplorer(HeapSnapshot* snapshot, 1031 NativeObjectsExplorer(HeapSnapshot* snapshot,
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 1152
1130 friend class HeapSnapshotJSONSerializerEnumerator; 1153 friend class HeapSnapshotJSONSerializerEnumerator;
1131 friend class HeapSnapshotJSONSerializerIterator; 1154 friend class HeapSnapshotJSONSerializerIterator;
1132 1155
1133 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); 1156 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer);
1134 }; 1157 };
1135 1158
1136 } } // namespace v8::internal 1159 } } // namespace v8::internal
1137 1160
1138 #endif // V8_PROFILE_GENERATOR_H_ 1161 #endif // V8_PROFILE_GENERATOR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698