| 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 | 
|---|