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 const char* GetName(int index); |
70 inline const char* GetFunctionName(String* name); | 71 inline const char* GetFunctionName(String* name); |
71 inline const char* GetFunctionName(const char* name); | 72 inline const char* GetFunctionName(const char* name); |
72 | 73 |
73 private: | 74 private: |
74 INLINE(static bool StringsMatch(void* key1, void* key2)) { | 75 INLINE(static bool StringsMatch(void* key1, void* key2)) { |
75 return strcmp(reinterpret_cast<char*>(key1), | 76 return strcmp(reinterpret_cast<char*>(key1), |
76 reinterpret_cast<char*>(key2)) == 0; | 77 reinterpret_cast<char*>(key2)) == 0; |
77 } | 78 } |
78 | 79 |
79 // Mapping of strings by String::Hash to const char* strings. | 80 // Mapping of strings by String::Hash to const char* strings. |
80 HashMap names_; | 81 HashMap names_; |
| 82 // Mapping from ints to char* strings. |
| 83 List<char*> index_names_; |
81 | 84 |
82 DISALLOW_COPY_AND_ASSIGN(StringsStorage); | 85 DISALLOW_COPY_AND_ASSIGN(StringsStorage); |
83 }; | 86 }; |
84 | 87 |
85 | 88 |
86 class CodeEntry { | 89 class CodeEntry { |
87 public: | 90 public: |
88 explicit INLINE(CodeEntry(int security_token_id)); | 91 explicit INLINE(CodeEntry(int security_token_id)); |
89 // CodeEntry doesn't own name strings, just references them. | 92 // CodeEntry doesn't own name strings, just references them. |
90 INLINE(CodeEntry(Logger::LogEventsAndTags tag, | 93 INLINE(CodeEntry(Logger::LogEventsAndTags tag, |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 | 280 |
278 bool StartProfiling(const char* title, unsigned uid); | 281 bool StartProfiling(const char* title, unsigned uid); |
279 bool StartProfiling(String* title, unsigned uid); | 282 bool StartProfiling(String* title, unsigned uid); |
280 CpuProfile* StopProfiling(int security_token_id, | 283 CpuProfile* StopProfiling(int security_token_id, |
281 const char* title, | 284 const char* title, |
282 double actual_sampling_rate); | 285 double actual_sampling_rate); |
283 List<CpuProfile*>* Profiles(int security_token_id); | 286 List<CpuProfile*>* Profiles(int security_token_id); |
284 const char* GetName(String* name) { | 287 const char* GetName(String* name) { |
285 return function_and_resource_names_.GetName(name); | 288 return function_and_resource_names_.GetName(name); |
286 } | 289 } |
| 290 const char* GetName(int args_count) { |
| 291 return function_and_resource_names_.GetName(args_count); |
| 292 } |
287 CpuProfile* GetProfile(int security_token_id, unsigned uid); | 293 CpuProfile* GetProfile(int security_token_id, unsigned uid); |
288 bool IsLastProfile(const char* title); | 294 bool IsLastProfile(const char* title); |
289 | 295 |
290 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, | 296 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, |
291 String* name, String* resource_name, int line_number); | 297 String* name, String* resource_name, int line_number); |
292 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name); | 298 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name); |
293 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, | 299 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, |
294 const char* name_prefix, String* name); | 300 const char* name_prefix, String* name); |
295 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, int args_count); | 301 CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, int args_count); |
296 CodeEntry* NewCodeEntry(int security_token_id); | 302 CodeEntry* NewCodeEntry(int security_token_id); |
297 | 303 |
298 // Called from profile generator thread. | 304 // Called from profile generator thread. |
299 void AddPathToCurrentProfiles(const Vector<CodeEntry*>& path); | 305 void AddPathToCurrentProfiles(const Vector<CodeEntry*>& path); |
300 | 306 |
301 // Limits the number of profiles that can be simultaneously collected. | 307 // Limits the number of profiles that can be simultaneously collected. |
302 static const int kMaxSimultaneousProfiles = 100; | 308 static const int kMaxSimultaneousProfiles = 100; |
303 | 309 |
304 private: | 310 private: |
305 const char* GetName(int args_count); | |
306 const char* GetFunctionName(String* name) { | 311 const char* GetFunctionName(String* name) { |
307 return function_and_resource_names_.GetFunctionName(name); | 312 return function_and_resource_names_.GetFunctionName(name); |
308 } | 313 } |
309 const char* GetFunctionName(const char* name) { | 314 const char* GetFunctionName(const char* name) { |
310 return function_and_resource_names_.GetFunctionName(name); | 315 return function_and_resource_names_.GetFunctionName(name); |
311 } | 316 } |
312 List<CpuProfile*>* GetProfilesList(int security_token_id); | 317 List<CpuProfile*>* GetProfilesList(int security_token_id); |
313 int TokenToIndex(int security_token_id); | 318 int TokenToIndex(int security_token_id); |
314 | 319 |
315 INLINE(static bool UidsMatch(void* key1, void* key2)) { | 320 INLINE(static bool UidsMatch(void* key1, void* key2)) { |
316 return key1 == key2; | 321 return key1 == key2; |
317 } | 322 } |
318 | 323 |
319 StringsStorage function_and_resource_names_; | 324 StringsStorage function_and_resource_names_; |
320 // Mapping from args_count (int) to char* strings. | |
321 List<char*> args_count_names_; | |
322 List<CodeEntry*> code_entries_; | 325 List<CodeEntry*> code_entries_; |
323 List<List<CpuProfile*>* > profiles_by_token_; | 326 List<List<CpuProfile*>* > profiles_by_token_; |
324 // Mapping from profiles' uids to indexes in the second nested list | 327 // Mapping from profiles' uids to indexes in the second nested list |
325 // of profiles_by_token_. | 328 // of profiles_by_token_. |
326 HashMap profiles_uids_; | 329 HashMap profiles_uids_; |
327 | 330 |
328 // Accessed by VM thread and profile generator thread. | 331 // Accessed by VM thread and profile generator thread. |
329 List<CpuProfile*> current_profiles_; | 332 List<CpuProfile*> current_profiles_; |
330 Semaphore* current_profiles_semaphore_; | 333 Semaphore* current_profiles_semaphore_; |
331 | 334 |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 // | 499 // |
497 class HeapEntry BASE_EMBEDDED { | 500 class HeapEntry BASE_EMBEDDED { |
498 public: | 501 public: |
499 enum Type { | 502 enum Type { |
500 kInternal = v8::HeapGraphNode::kInternal, | 503 kInternal = v8::HeapGraphNode::kInternal, |
501 kArray = v8::HeapGraphNode::kArray, | 504 kArray = v8::HeapGraphNode::kArray, |
502 kString = v8::HeapGraphNode::kString, | 505 kString = v8::HeapGraphNode::kString, |
503 kObject = v8::HeapGraphNode::kObject, | 506 kObject = v8::HeapGraphNode::kObject, |
504 kCode = v8::HeapGraphNode::kCode, | 507 kCode = v8::HeapGraphNode::kCode, |
505 kClosure = v8::HeapGraphNode::kClosure, | 508 kClosure = v8::HeapGraphNode::kClosure, |
506 kRegExp = v8::HeapGraphNode::kRegExp | 509 kRegExp = v8::HeapGraphNode::kRegExp, |
| 510 kHeapNumber = v8::HeapGraphNode::kHeapNumber |
507 }; | 511 }; |
508 | 512 |
509 HeapEntry() { } | 513 HeapEntry() { } |
510 void Init(HeapSnapshot* snapshot, | 514 void Init(HeapSnapshot* snapshot, |
511 Type type, | 515 Type type, |
512 const char* name, | 516 const char* name, |
513 uint64_t id, | 517 uint64_t id, |
514 int self_size, | 518 int self_size, |
515 int children_count, | 519 int children_count, |
516 int retainers_count); | 520 int retainers_count); |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
818 | 822 |
819 bool is_tracking_objects() { return is_tracking_objects_; } | 823 bool is_tracking_objects() { return is_tracking_objects_; } |
820 | 824 |
821 HeapSnapshot* NewSnapshot( | 825 HeapSnapshot* NewSnapshot( |
822 HeapSnapshot::Type type, const char* name, unsigned uid); | 826 HeapSnapshot::Type type, const char* name, unsigned uid); |
823 void SnapshotGenerationFinished() { ids_.SnapshotGenerationFinished(); } | 827 void SnapshotGenerationFinished() { ids_.SnapshotGenerationFinished(); } |
824 List<HeapSnapshot*>* snapshots() { return &snapshots_; } | 828 List<HeapSnapshot*>* snapshots() { return &snapshots_; } |
825 HeapSnapshot* GetSnapshot(unsigned uid); | 829 HeapSnapshot* GetSnapshot(unsigned uid); |
826 | 830 |
827 const char* GetName(String* name) { return names_.GetName(name); } | 831 const char* GetName(String* name) { return names_.GetName(name); } |
| 832 const char* GetName(int index) { return names_.GetName(index); } |
828 const char* GetFunctionName(String* name) { | 833 const char* GetFunctionName(String* name) { |
829 return names_.GetFunctionName(name); | 834 return names_.GetFunctionName(name); |
830 } | 835 } |
831 | 836 |
832 TokenEnumerator* token_enumerator() { return token_enumerator_; } | 837 TokenEnumerator* token_enumerator() { return token_enumerator_; } |
833 | 838 |
834 uint64_t GetObjectId(Address addr) { return ids_.FindObject(addr); } | 839 uint64_t GetObjectId(Address addr) { return ids_.FindObject(addr); } |
835 void ObjectMoveEvent(Address from, Address to) { ids_.MoveObject(from, to); } | 840 void ObjectMoveEvent(Address from, Address to) { ids_.MoveObject(from, to); } |
836 | 841 |
837 HeapSnapshotsDiff* CompareSnapshots(HeapSnapshot* snapshot1, | 842 HeapSnapshotsDiff* CompareSnapshots(HeapSnapshot* snapshot1, |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 void GenerateSnapshot(); | 947 void GenerateSnapshot(); |
943 | 948 |
944 private: | 949 private: |
945 HeapEntry* GetEntry(Object* obj); | 950 HeapEntry* GetEntry(Object* obj); |
946 int GetGlobalSecurityToken(); | 951 int GetGlobalSecurityToken(); |
947 int GetObjectSecurityToken(HeapObject* obj); | 952 int GetObjectSecurityToken(HeapObject* obj); |
948 void ExtractReferences(HeapObject* obj); | 953 void ExtractReferences(HeapObject* obj); |
949 void ExtractClosureReferences(JSObject* js_obj, HeapEntry* entry); | 954 void ExtractClosureReferences(JSObject* js_obj, HeapEntry* entry); |
950 void ExtractPropertyReferences(JSObject* js_obj, HeapEntry* entry); | 955 void ExtractPropertyReferences(JSObject* js_obj, HeapEntry* entry); |
951 void ExtractElementReferences(JSObject* js_obj, HeapEntry* entry); | 956 void ExtractElementReferences(JSObject* js_obj, HeapEntry* entry); |
| 957 void ExtractInternalReferences(JSObject* js_obj, HeapEntry* entry); |
952 void SetClosureReference(HeapObject* parent_obj, | 958 void SetClosureReference(HeapObject* parent_obj, |
953 HeapEntry* parent, | 959 HeapEntry* parent, |
954 String* reference_name, | 960 String* reference_name, |
955 Object* child); | 961 Object* child); |
956 void SetElementReference(HeapObject* parent_obj, | 962 void SetElementReference(HeapObject* parent_obj, |
957 HeapEntry* parent, | 963 HeapEntry* parent, |
958 int index, | 964 int index, |
959 Object* child); | 965 Object* child); |
960 void SetInternalReference(HeapObject* parent_obj, | 966 void SetInternalReference(HeapObject* parent_obj, |
961 HeapEntry* parent, | 967 HeapEntry* parent, |
962 const char* reference_name, | 968 const char* reference_name, |
963 Object* child); | 969 Object* child); |
| 970 void SetInternalReference(HeapObject* parent_obj, |
| 971 HeapEntry* parent, |
| 972 int index, |
| 973 Object* child); |
964 void SetPropertyReference(HeapObject* parent_obj, | 974 void SetPropertyReference(HeapObject* parent_obj, |
965 HeapEntry* parent, | 975 HeapEntry* parent, |
966 String* reference_name, | 976 String* reference_name, |
967 Object* child); | 977 Object* child); |
968 void SetRootReference(Object* child); | 978 void SetRootReference(Object* child); |
969 | 979 |
970 HeapSnapshot* snapshot_; | 980 HeapSnapshot* snapshot_; |
971 HeapSnapshotsCollection* collection_; | 981 HeapSnapshotsCollection* collection_; |
972 // Mapping from HeapObject* pointers to HeapEntry* pointers. | 982 // Mapping from HeapObject* pointers to HeapEntry* pointers. |
973 HeapEntriesMap entries_; | 983 HeapEntriesMap entries_; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1025 friend class HeapSnapshotJSONSerializerIterator; | 1035 friend class HeapSnapshotJSONSerializerIterator; |
1026 | 1036 |
1027 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); | 1037 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); |
1028 }; | 1038 }; |
1029 | 1039 |
1030 } } // namespace v8::internal | 1040 } } // namespace v8::internal |
1031 | 1041 |
1032 #endif // ENABLE_LOGGING_AND_PROFILING | 1042 #endif // ENABLE_LOGGING_AND_PROFILING |
1033 | 1043 |
1034 #endif // V8_PROFILE_GENERATOR_H_ | 1044 #endif // V8_PROFILE_GENERATOR_H_ |
OLD | NEW |