OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 | 60 |
61 | 61 |
62 // Provides a storage of strings allocated in C++ heap, to hold them | 62 // Provides a storage of strings allocated in C++ heap, to hold them |
63 // forever, even if they disappear from JS heap or external storage. | 63 // forever, even if they disappear from JS heap or external storage. |
64 class StringsStorage { | 64 class StringsStorage { |
65 public: | 65 public: |
66 StringsStorage(); | 66 StringsStorage(); |
67 ~StringsStorage(); | 67 ~StringsStorage(); |
68 | 68 |
69 const char* GetName(String* name); | 69 const char* GetName(String* name); |
| 70 inline const char* GetFunctionName(String* name); |
| 71 inline const char* GetFunctionName(const char* name); |
70 | 72 |
71 private: | 73 private: |
72 INLINE(static bool StringsMatch(void* key1, void* key2)) { | 74 INLINE(static bool StringsMatch(void* key1, void* key2)) { |
73 return strcmp(reinterpret_cast<char*>(key1), | 75 return strcmp(reinterpret_cast<char*>(key1), |
74 reinterpret_cast<char*>(key2)) == 0; | 76 reinterpret_cast<char*>(key2)) == 0; |
75 } | 77 } |
76 | 78 |
77 // Mapping of strings by String::Hash to const char* strings. | 79 // Mapping of strings by String::Hash to const char* strings. |
78 HashMap names_; | 80 HashMap names_; |
79 | 81 |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name); | 293 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name); |
292 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, | 294 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, |
293 const char* name_prefix, String* name); | 295 const char* name_prefix, String* name); |
294 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, int args_count); | 296 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, int args_count); |
295 CodeEntry* NewCodeEntry(int security_token_id); | 297 CodeEntry* NewCodeEntry(int security_token_id); |
296 | 298 |
297 // Called from profile generator thread. | 299 // Called from profile generator thread. |
298 void AddPathToCurrentProfiles(const Vector<CodeEntry*>& path); | 300 void AddPathToCurrentProfiles(const Vector<CodeEntry*>& path); |
299 | 301 |
300 private: | 302 private: |
301 INLINE(const char* GetFunctionName(String* name)); | |
302 INLINE(const char* GetFunctionName(const char* name)); | |
303 const char* GetName(int args_count); | 303 const char* GetName(int args_count); |
| 304 const char* GetFunctionName(String* name) { |
| 305 return function_and_resource_names_.GetFunctionName(name); |
| 306 } |
| 307 const char* GetFunctionName(const char* name) { |
| 308 return function_and_resource_names_.GetFunctionName(name); |
| 309 } |
304 List<CpuProfile*>* GetProfilesList(int security_token_id); | 310 List<CpuProfile*>* GetProfilesList(int security_token_id); |
305 int TokenToIndex(int security_token_id); | 311 int TokenToIndex(int security_token_id); |
306 | 312 |
307 INLINE(static bool UidsMatch(void* key1, void* key2)) { | 313 INLINE(static bool UidsMatch(void* key1, void* key2)) { |
308 return key1 == key2; | 314 return key1 == key2; |
309 } | 315 } |
310 | 316 |
311 StringsStorage function_and_resource_names_; | 317 StringsStorage function_and_resource_names_; |
312 // Mapping from args_count (int) to char* strings. | 318 // Mapping from args_count (int) to char* strings. |
313 List<char*> args_count_names_; | 319 List<char*> args_count_names_; |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 enum Type { | 497 enum Type { |
492 kInternal = v8::HeapGraphNode::kInternal, | 498 kInternal = v8::HeapGraphNode::kInternal, |
493 kArray = v8::HeapGraphNode::kArray, | 499 kArray = v8::HeapGraphNode::kArray, |
494 kString = v8::HeapGraphNode::kString, | 500 kString = v8::HeapGraphNode::kString, |
495 kObject = v8::HeapGraphNode::kObject, | 501 kObject = v8::HeapGraphNode::kObject, |
496 kCode = v8::HeapGraphNode::kCode, | 502 kCode = v8::HeapGraphNode::kCode, |
497 kClosure = v8::HeapGraphNode::kClosure | 503 kClosure = v8::HeapGraphNode::kClosure |
498 }; | 504 }; |
499 | 505 |
500 HeapEntry() { } | 506 HeapEntry() { } |
501 void Init(HeapSnapshot* snapshot, int children_count, int retainers_count); | |
502 void Init(HeapSnapshot* snapshot, | 507 void Init(HeapSnapshot* snapshot, |
503 Type type, | 508 Type type, |
504 const char* name, | 509 const char* name, |
505 uint64_t id, | 510 uint64_t id, |
506 int self_size, | 511 int self_size, |
507 int children_count, | 512 int children_count, |
508 int retainers_count); | 513 int retainers_count); |
509 | 514 |
510 HeapSnapshot* snapshot() { return snapshot_; } | 515 HeapSnapshot* snapshot() { return snapshot_; } |
511 Type type() { return static_cast<Type>(type_); } | 516 Type type() { return static_cast<Type>(type_); } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 class HeapSnapshotsCollection; | 638 class HeapSnapshotsCollection; |
634 class HeapSnapshotsDiff; | 639 class HeapSnapshotsDiff; |
635 | 640 |
636 // HeapSnapshot represents a single heap snapshot. It is stored in | 641 // HeapSnapshot represents a single heap snapshot. It is stored in |
637 // HeapSnapshotsCollection, which is also a factory for | 642 // HeapSnapshotsCollection, which is also a factory for |
638 // HeapSnapshots. All HeapSnapshots share strings copied from JS heap | 643 // HeapSnapshots. All HeapSnapshots share strings copied from JS heap |
639 // to be able to return them even if they were collected. | 644 // to be able to return them even if they were collected. |
640 // HeapSnapshotGenerator fills in a HeapSnapshot. | 645 // HeapSnapshotGenerator fills in a HeapSnapshot. |
641 class HeapSnapshot { | 646 class HeapSnapshot { |
642 public: | 647 public: |
| 648 enum Type { |
| 649 kFull = v8::HeapSnapshot::kFull, |
| 650 kAggregated = v8::HeapSnapshot::kAggregated |
| 651 }; |
| 652 |
643 HeapSnapshot(HeapSnapshotsCollection* collection, | 653 HeapSnapshot(HeapSnapshotsCollection* collection, |
| 654 Type type, |
644 const char* title, | 655 const char* title, |
645 unsigned uid); | 656 unsigned uid); |
646 ~HeapSnapshot(); | 657 ~HeapSnapshot(); |
647 | 658 |
648 HeapSnapshotsCollection* collection() { return collection_; } | 659 HeapSnapshotsCollection* collection() { return collection_; } |
| 660 Type type() { return type_; } |
649 const char* title() { return title_; } | 661 const char* title() { return title_; } |
650 unsigned uid() { return uid_; } | 662 unsigned uid() { return uid_; } |
651 HeapEntry* root() { return entries_[root_entry_index_]; } | 663 HeapEntry* root() { return entries_[root_entry_index_]; } |
652 | 664 |
653 void AllocateEntries( | 665 void AllocateEntries( |
654 int entries_count, int children_count, int retainers_count); | 666 int entries_count, int children_count, int retainers_count); |
655 HeapEntry* AddEntry( | 667 HeapEntry* AddEntry( |
656 HeapObject* object, int children_count, int retainers_count); | 668 HeapObject* object, int children_count, int retainers_count); |
657 bool WillAddEntry(HeapObject* object); | 669 bool WillAddEntry(HeapObject* object); |
| 670 HeapEntry* AddEntry(HeapEntry::Type type, |
| 671 const char* name, |
| 672 uint64_t id, |
| 673 int size, |
| 674 int children_count, |
| 675 int retainers_count); |
658 int AddCalculatedData(); | 676 int AddCalculatedData(); |
659 HeapEntryCalculatedData& GetCalculatedData(int index) { | 677 HeapEntryCalculatedData& GetCalculatedData(int index) { |
660 return calculated_data_[index]; | 678 return calculated_data_[index]; |
661 } | 679 } |
662 void ClearPaint(); | 680 void ClearPaint(); |
663 HeapSnapshotsDiff* CompareWith(HeapSnapshot* snapshot); | 681 HeapSnapshotsDiff* CompareWith(HeapSnapshot* snapshot); |
664 List<HeapEntry*>* GetSortedEntriesList(); | 682 List<HeapEntry*>* GetSortedEntriesList(); |
665 template<class Visitor> | 683 template<class Visitor> |
666 void IterateEntries(Visitor* visitor) { entries_.Iterate(visitor); } | 684 void IterateEntries(Visitor* visitor) { entries_.Iterate(visitor); } |
667 | 685 |
668 void Print(int max_depth); | 686 void Print(int max_depth); |
669 void PrintEntriesSize(); | 687 void PrintEntriesSize(); |
670 | 688 |
671 static HeapObject *const kInternalRootObject; | 689 static HeapObject *const kInternalRootObject; |
672 | 690 |
673 private: | 691 private: |
674 HeapEntry* AddEntry(HeapObject* object, | 692 HeapEntry* AddEntry(HeapObject* object, |
675 HeapEntry::Type type, | 693 HeapEntry::Type type, |
676 const char* name, | 694 const char* name, |
677 int children_count, | 695 int children_count, |
678 int retainers_count); | 696 int retainers_count); |
679 HeapEntry* GetNextEntryToInit(); | 697 HeapEntry* GetNextEntryToInit(); |
680 static int GetObjectSize(HeapObject* obj); | 698 static int GetObjectSize(HeapObject* obj); |
681 static int CalculateNetworkSize(JSObject* obj); | 699 static int CalculateNetworkSize(JSObject* obj); |
682 | 700 |
683 HeapSnapshotsCollection* collection_; | 701 HeapSnapshotsCollection* collection_; |
| 702 Type type_; |
684 const char* title_; | 703 const char* title_; |
685 unsigned uid_; | 704 unsigned uid_; |
686 int root_entry_index_; | 705 int root_entry_index_; |
687 char* raw_entries_; | 706 char* raw_entries_; |
688 List<HeapEntry*> entries_; | 707 List<HeapEntry*> entries_; |
689 bool entries_sorted_; | 708 bool entries_sorted_; |
690 List<HeapEntryCalculatedData> calculated_data_; | 709 List<HeapEntryCalculatedData> calculated_data_; |
| 710 #ifdef DEBUG |
| 711 int raw_entries_size_; |
| 712 #endif |
691 | 713 |
692 friend class HeapSnapshotTester; | 714 friend class HeapSnapshotTester; |
693 | 715 |
694 DISALLOW_COPY_AND_ASSIGN(HeapSnapshot); | 716 DISALLOW_COPY_AND_ASSIGN(HeapSnapshot); |
695 }; | 717 }; |
696 | 718 |
697 | 719 |
698 class HeapObjectsMap { | 720 class HeapObjectsMap { |
699 public: | 721 public: |
700 HeapObjectsMap(); | 722 HeapObjectsMap(); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
785 }; | 807 }; |
786 | 808 |
787 | 809 |
788 class HeapSnapshotsCollection { | 810 class HeapSnapshotsCollection { |
789 public: | 811 public: |
790 HeapSnapshotsCollection(); | 812 HeapSnapshotsCollection(); |
791 ~HeapSnapshotsCollection(); | 813 ~HeapSnapshotsCollection(); |
792 | 814 |
793 bool is_tracking_objects() { return is_tracking_objects_; } | 815 bool is_tracking_objects() { return is_tracking_objects_; } |
794 | 816 |
795 HeapSnapshot* NewSnapshot(const char* name, unsigned uid); | 817 HeapSnapshot* NewSnapshot( |
| 818 HeapSnapshot::Type type, const char* name, unsigned uid); |
796 void SnapshotGenerationFinished() { ids_.SnapshotGenerationFinished(); } | 819 void SnapshotGenerationFinished() { ids_.SnapshotGenerationFinished(); } |
797 List<HeapSnapshot*>* snapshots() { return &snapshots_; } | 820 List<HeapSnapshot*>* snapshots() { return &snapshots_; } |
798 HeapSnapshot* GetSnapshot(unsigned uid); | 821 HeapSnapshot* GetSnapshot(unsigned uid); |
799 | 822 |
800 const char* GetName(String* name) { return names_.GetName(name); } | 823 const char* GetName(String* name) { return names_.GetName(name); } |
| 824 const char* GetFunctionName(String* name) { |
| 825 return names_.GetFunctionName(name); |
| 826 } |
801 | 827 |
802 TokenEnumerator* token_enumerator() { return token_enumerator_; } | 828 TokenEnumerator* token_enumerator() { return token_enumerator_; } |
803 | 829 |
804 uint64_t GetObjectId(Address addr) { return ids_.FindObject(addr); } | 830 uint64_t GetObjectId(Address addr) { return ids_.FindObject(addr); } |
805 void ObjectMoveEvent(Address from, Address to) { ids_.MoveObject(from, to); } | 831 void ObjectMoveEvent(Address from, Address to) { ids_.MoveObject(from, to); } |
806 | 832 |
807 HeapSnapshotsDiff* CompareSnapshots(HeapSnapshot* snapshot1, | 833 HeapSnapshotsDiff* CompareSnapshots(HeapSnapshot* snapshot1, |
808 HeapSnapshot* snapshot2); | 834 HeapSnapshot* snapshot2); |
809 | 835 |
810 private: | 836 private: |
(...skipping 30 matching lines...) Expand all Loading... |
841 void CountReference(HeapObject* from, HeapObject* to, | 867 void CountReference(HeapObject* from, HeapObject* to, |
842 int* prev_children_count = NULL, | 868 int* prev_children_count = NULL, |
843 int* prev_retainers_count = NULL); | 869 int* prev_retainers_count = NULL); |
844 template<class Visitor> | 870 template<class Visitor> |
845 void UpdateEntries(Visitor* visitor); | 871 void UpdateEntries(Visitor* visitor); |
846 | 872 |
847 int entries_count() { return entries_count_; } | 873 int entries_count() { return entries_count_; } |
848 int total_children_count() { return total_children_count_; } | 874 int total_children_count() { return total_children_count_; } |
849 int total_retainers_count() { return total_retainers_count_; } | 875 int total_retainers_count() { return total_retainers_count_; } |
850 | 876 |
| 877 static HeapEntry *const kHeapEntryPlaceholder; |
| 878 |
851 private: | 879 private: |
852 struct EntryInfo { | 880 struct EntryInfo { |
853 explicit EntryInfo(HeapEntry* entry) | 881 explicit EntryInfo(HeapEntry* entry) |
854 : entry(entry), children_count(0), retainers_count(0) { } | 882 : entry(entry), children_count(0), retainers_count(0) { } |
855 HeapEntry* entry; | 883 HeapEntry* entry; |
856 int children_count; | 884 int children_count; |
857 int retainers_count; | 885 int retainers_count; |
858 }; | 886 }; |
859 | 887 |
860 uint32_t Hash(HeapObject* object) { | 888 uint32_t Hash(HeapObject* object) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 Object* child_obj, | 924 Object* child_obj, |
897 HeapEntry* child_entry) = 0; | 925 HeapEntry* child_entry) = 0; |
898 virtual void SetNamedReference(HeapGraphEdge::Type type, | 926 virtual void SetNamedReference(HeapGraphEdge::Type type, |
899 HeapObject* parent_obj, | 927 HeapObject* parent_obj, |
900 HeapEntry* parent_entry, | 928 HeapEntry* parent_entry, |
901 const char* reference_name, | 929 const char* reference_name, |
902 Object* child_obj, | 930 Object* child_obj, |
903 HeapEntry* child_entry) = 0; | 931 HeapEntry* child_entry) = 0; |
904 virtual void SetRootReference(Object* child_obj, | 932 virtual void SetRootReference(Object* child_obj, |
905 HeapEntry* child_entry) = 0; | 933 HeapEntry* child_entry) = 0; |
906 | |
907 static HeapEntry *const kHeapEntryPlaceholder; | |
908 }; | 934 }; |
909 | 935 |
910 explicit HeapSnapshotGenerator(HeapSnapshot* snapshot); | 936 explicit HeapSnapshotGenerator(HeapSnapshot* snapshot); |
911 void GenerateSnapshot(); | 937 void GenerateSnapshot(); |
912 | 938 |
913 private: | 939 private: |
914 HeapEntry* GetEntry(Object* obj); | 940 HeapEntry* GetEntry(Object* obj); |
915 int GetGlobalSecurityToken(); | 941 int GetGlobalSecurityToken(); |
916 int GetObjectSecurityToken(HeapObject* obj); | 942 int GetObjectSecurityToken(HeapObject* obj); |
917 void ExtractReferences(HeapObject* obj); | 943 void ExtractReferences(HeapObject* obj); |
(...skipping 27 matching lines...) Expand all Loading... |
945 friend class IndexedReferencesExtractor; | 971 friend class IndexedReferencesExtractor; |
946 | 972 |
947 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotGenerator); | 973 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotGenerator); |
948 }; | 974 }; |
949 | 975 |
950 } } // namespace v8::internal | 976 } } // namespace v8::internal |
951 | 977 |
952 #endif // ENABLE_LOGGING_AND_PROFILING | 978 #endif // ENABLE_LOGGING_AND_PROFILING |
953 | 979 |
954 #endif // V8_PROFILE_GENERATOR_H_ | 980 #endif // V8_PROFILE_GENERATOR_H_ |
OLD | NEW |