| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 #include "profile-generator-inl.h" | 31 #include "profile-generator-inl.h" |
| 32 | 32 |
| 33 namespace v8 { | 33 namespace v8 { |
| 34 namespace internal { | 34 namespace internal { |
| 35 | 35 |
| 36 class AllocationTracker; | 36 class AllocationTracker; |
| 37 class AllocationTraceNode; | 37 class AllocationTraceNode; |
| 38 class HeapEntry; | 38 class HeapEntry; |
| 39 class HeapSnapshot; | 39 class HeapSnapshot; |
| 40 class SnapshotFiller; |
| 40 | 41 |
| 41 class HeapGraphEdge BASE_EMBEDDED { | 42 class HeapGraphEdge BASE_EMBEDDED { |
| 42 public: | 43 public: |
| 43 enum Type { | 44 enum Type { |
| 44 kContextVariable = v8::HeapGraphEdge::kContextVariable, | 45 kContextVariable = v8::HeapGraphEdge::kContextVariable, |
| 45 kElement = v8::HeapGraphEdge::kElement, | 46 kElement = v8::HeapGraphEdge::kElement, |
| 46 kProperty = v8::HeapGraphEdge::kProperty, | 47 kProperty = v8::HeapGraphEdge::kProperty, |
| 47 kInternal = v8::HeapGraphEdge::kInternal, | 48 kInternal = v8::HeapGraphEdge::kInternal, |
| 48 kHidden = v8::HeapGraphEdge::kHidden, | 49 kHidden = v8::HeapGraphEdge::kHidden, |
| 49 kShortcut = v8::HeapGraphEdge::kShortcut, | 50 kShortcut = v8::HeapGraphEdge::kShortcut, |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 void SetTag(Object* obj, const char* tag); | 337 void SetTag(Object* obj, const char* tag); |
| 337 bool is_empty() const { return entries_.occupancy() == 0; } | 338 bool is_empty() const { return entries_.occupancy() == 0; } |
| 338 | 339 |
| 339 private: | 340 private: |
| 340 HashMap entries_; | 341 HashMap entries_; |
| 341 | 342 |
| 342 DISALLOW_COPY_AND_ASSIGN(HeapObjectsSet); | 343 DISALLOW_COPY_AND_ASSIGN(HeapObjectsSet); |
| 343 }; | 344 }; |
| 344 | 345 |
| 345 | 346 |
| 346 // An interface used to populate a snapshot with nodes and edges. | |
| 347 class SnapshotFillerInterface { | |
| 348 public: | |
| 349 virtual ~SnapshotFillerInterface() { } | |
| 350 virtual HeapEntry* AddEntry(HeapThing ptr, | |
| 351 HeapEntriesAllocator* allocator) = 0; | |
| 352 virtual HeapEntry* FindEntry(HeapThing ptr) = 0; | |
| 353 virtual HeapEntry* FindOrAddEntry(HeapThing ptr, | |
| 354 HeapEntriesAllocator* allocator) = 0; | |
| 355 virtual void SetIndexedReference(HeapGraphEdge::Type type, | |
| 356 int parent_entry, | |
| 357 int index, | |
| 358 HeapEntry* child_entry) = 0; | |
| 359 virtual void SetIndexedAutoIndexReference(HeapGraphEdge::Type type, | |
| 360 int parent_entry, | |
| 361 HeapEntry* child_entry) = 0; | |
| 362 virtual void SetNamedReference(HeapGraphEdge::Type type, | |
| 363 int parent_entry, | |
| 364 const char* reference_name, | |
| 365 HeapEntry* child_entry) = 0; | |
| 366 virtual void SetNamedAutoIndexReference(HeapGraphEdge::Type type, | |
| 367 int parent_entry, | |
| 368 HeapEntry* child_entry) = 0; | |
| 369 }; | |
| 370 | |
| 371 | |
| 372 class SnapshottingProgressReportingInterface { | 347 class SnapshottingProgressReportingInterface { |
| 373 public: | 348 public: |
| 374 virtual ~SnapshottingProgressReportingInterface() { } | 349 virtual ~SnapshottingProgressReportingInterface() { } |
| 375 virtual void ProgressStep() = 0; | 350 virtual void ProgressStep() = 0; |
| 376 virtual bool ProgressReport(bool force) = 0; | 351 virtual bool ProgressReport(bool force) = 0; |
| 377 }; | 352 }; |
| 378 | 353 |
| 379 | 354 |
| 380 // An implementation of V8 heap graph extractor. | 355 // An implementation of V8 heap graph extractor. |
| 381 class V8HeapExplorer : public HeapEntriesAllocator { | 356 class V8HeapExplorer : public HeapEntriesAllocator { |
| 382 public: | 357 public: |
| 383 V8HeapExplorer(HeapSnapshot* snapshot, | 358 V8HeapExplorer(HeapSnapshot* snapshot, |
| 384 SnapshottingProgressReportingInterface* progress, | 359 SnapshottingProgressReportingInterface* progress, |
| 385 v8::HeapProfiler::ObjectNameResolver* resolver); | 360 v8::HeapProfiler::ObjectNameResolver* resolver); |
| 386 virtual ~V8HeapExplorer(); | 361 virtual ~V8HeapExplorer(); |
| 387 virtual HeapEntry* AllocateEntry(HeapThing ptr); | 362 virtual HeapEntry* AllocateEntry(HeapThing ptr); |
| 388 void AddRootEntries(SnapshotFillerInterface* filler); | 363 void AddRootEntries(SnapshotFiller* filler); |
| 389 int EstimateObjectsCount(HeapIterator* iterator); | 364 int EstimateObjectsCount(HeapIterator* iterator); |
| 390 bool IterateAndExtractReferences(SnapshotFillerInterface* filler); | 365 bool IterateAndExtractReferences(SnapshotFiller* filler); |
| 391 void TagGlobalObjects(); | 366 void TagGlobalObjects(); |
| 392 void TagCodeObject(Code* code); | 367 void TagCodeObject(Code* code); |
| 393 void TagBuiltinCodeObject(Code* code, const char* name); | 368 void TagBuiltinCodeObject(Code* code, const char* name); |
| 394 HeapEntry* AddEntry(Address address, | 369 HeapEntry* AddEntry(Address address, |
| 395 HeapEntry::Type type, | 370 HeapEntry::Type type, |
| 396 const char* name, | 371 const char* name, |
| 397 size_t size); | 372 size_t size); |
| 398 | 373 |
| 399 static String* GetConstructorName(JSObject* object); | 374 static String* GetConstructorName(JSObject* object); |
| 400 | 375 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 HeapEntry* GetEntry(Object* obj); | 456 HeapEntry* GetEntry(Object* obj); |
| 482 | 457 |
| 483 static inline HeapObject* GetNthGcSubrootObject(int delta); | 458 static inline HeapObject* GetNthGcSubrootObject(int delta); |
| 484 static inline int GetGcSubrootOrder(HeapObject* subroot); | 459 static inline int GetGcSubrootOrder(HeapObject* subroot); |
| 485 | 460 |
| 486 Heap* heap_; | 461 Heap* heap_; |
| 487 HeapSnapshot* snapshot_; | 462 HeapSnapshot* snapshot_; |
| 488 StringsStorage* names_; | 463 StringsStorage* names_; |
| 489 HeapObjectsMap* heap_object_map_; | 464 HeapObjectsMap* heap_object_map_; |
| 490 SnapshottingProgressReportingInterface* progress_; | 465 SnapshottingProgressReportingInterface* progress_; |
| 491 SnapshotFillerInterface* filler_; | 466 SnapshotFiller* filler_; |
| 492 HeapObjectsSet objects_tags_; | 467 HeapObjectsSet objects_tags_; |
| 493 HeapObjectsSet strong_gc_subroot_names_; | 468 HeapObjectsSet strong_gc_subroot_names_; |
| 494 HeapObjectsSet user_roots_; | 469 HeapObjectsSet user_roots_; |
| 495 v8::HeapProfiler::ObjectNameResolver* global_object_name_resolver_; | 470 v8::HeapProfiler::ObjectNameResolver* global_object_name_resolver_; |
| 496 | 471 |
| 497 static HeapObject* const kGcRootsObject; | 472 static HeapObject* const kGcRootsObject; |
| 498 static HeapObject* const kFirstGcSubrootObject; | 473 static HeapObject* const kFirstGcSubrootObject; |
| 499 static HeapObject* const kLastGcSubrootObject; | 474 static HeapObject* const kLastGcSubrootObject; |
| 500 | 475 |
| 501 friend class IndexedReferencesExtractor; | 476 friend class IndexedReferencesExtractor; |
| 502 friend class GcSubrootsEnumerator; | 477 friend class GcSubrootsEnumerator; |
| 503 friend class RootsReferencesExtractor; | 478 friend class RootsReferencesExtractor; |
| 504 | 479 |
| 505 DISALLOW_COPY_AND_ASSIGN(V8HeapExplorer); | 480 DISALLOW_COPY_AND_ASSIGN(V8HeapExplorer); |
| 506 }; | 481 }; |
| 507 | 482 |
| 508 | 483 |
| 509 class NativeGroupRetainedObjectInfo; | 484 class NativeGroupRetainedObjectInfo; |
| 510 | 485 |
| 511 | 486 |
| 512 // An implementation of retained native objects extractor. | 487 // An implementation of retained native objects extractor. |
| 513 class NativeObjectsExplorer { | 488 class NativeObjectsExplorer { |
| 514 public: | 489 public: |
| 515 NativeObjectsExplorer(HeapSnapshot* snapshot, | 490 NativeObjectsExplorer(HeapSnapshot* snapshot, |
| 516 SnapshottingProgressReportingInterface* progress); | 491 SnapshottingProgressReportingInterface* progress); |
| 517 virtual ~NativeObjectsExplorer(); | 492 virtual ~NativeObjectsExplorer(); |
| 518 void AddRootEntries(SnapshotFillerInterface* filler); | 493 void AddRootEntries(SnapshotFiller* filler); |
| 519 int EstimateObjectsCount(); | 494 int EstimateObjectsCount(); |
| 520 bool IterateAndExtractReferences(SnapshotFillerInterface* filler); | 495 bool IterateAndExtractReferences(SnapshotFiller* filler); |
| 521 | 496 |
| 522 private: | 497 private: |
| 523 void FillRetainedObjects(); | 498 void FillRetainedObjects(); |
| 524 void FillImplicitReferences(); | 499 void FillImplicitReferences(); |
| 525 List<HeapObject*>* GetListMaybeDisposeInfo(v8::RetainedObjectInfo* info); | 500 List<HeapObject*>* GetListMaybeDisposeInfo(v8::RetainedObjectInfo* info); |
| 526 void SetNativeRootReference(v8::RetainedObjectInfo* info); | 501 void SetNativeRootReference(v8::RetainedObjectInfo* info); |
| 527 void SetRootNativeRootsReference(); | 502 void SetRootNativeRootsReference(); |
| 528 void SetWrapperNativeReferences(HeapObject* wrapper, | 503 void SetWrapperNativeReferences(HeapObject* wrapper, |
| 529 v8::RetainedObjectInfo* info); | 504 v8::RetainedObjectInfo* info); |
| 530 void VisitSubtreeWrapper(Object** p, uint16_t class_id); | 505 void VisitSubtreeWrapper(Object** p, uint16_t class_id); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 550 StringsStorage* names_; | 525 StringsStorage* names_; |
| 551 SnapshottingProgressReportingInterface* progress_; | 526 SnapshottingProgressReportingInterface* progress_; |
| 552 bool embedder_queried_; | 527 bool embedder_queried_; |
| 553 HeapObjectsSet in_groups_; | 528 HeapObjectsSet in_groups_; |
| 554 // RetainedObjectInfo* -> List<HeapObject*>* | 529 // RetainedObjectInfo* -> List<HeapObject*>* |
| 555 HashMap objects_by_info_; | 530 HashMap objects_by_info_; |
| 556 HashMap native_groups_; | 531 HashMap native_groups_; |
| 557 HeapEntriesAllocator* synthetic_entries_allocator_; | 532 HeapEntriesAllocator* synthetic_entries_allocator_; |
| 558 HeapEntriesAllocator* native_entries_allocator_; | 533 HeapEntriesAllocator* native_entries_allocator_; |
| 559 // Used during references extraction. | 534 // Used during references extraction. |
| 560 SnapshotFillerInterface* filler_; | 535 SnapshotFiller* filler_; |
| 561 | 536 |
| 562 static HeapThing const kNativesRootObject; | 537 static HeapThing const kNativesRootObject; |
| 563 | 538 |
| 564 friend class GlobalHandlesExtractor; | 539 friend class GlobalHandlesExtractor; |
| 565 | 540 |
| 566 DISALLOW_COPY_AND_ASSIGN(NativeObjectsExplorer); | 541 DISALLOW_COPY_AND_ASSIGN(NativeObjectsExplorer); |
| 567 }; | 542 }; |
| 568 | 543 |
| 569 | 544 |
| 570 class HeapSnapshotGenerator : public SnapshottingProgressReportingInterface { | 545 class HeapSnapshotGenerator : public SnapshottingProgressReportingInterface { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 friend class HeapSnapshotJSONSerializerEnumerator; | 622 friend class HeapSnapshotJSONSerializerEnumerator; |
| 648 friend class HeapSnapshotJSONSerializerIterator; | 623 friend class HeapSnapshotJSONSerializerIterator; |
| 649 | 624 |
| 650 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); | 625 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); |
| 651 }; | 626 }; |
| 652 | 627 |
| 653 | 628 |
| 654 } } // namespace v8::internal | 629 } } // namespace v8::internal |
| 655 | 630 |
| 656 #endif // V8_HEAP_SNAPSHOT_GENERATOR_H_ | 631 #endif // V8_HEAP_SNAPSHOT_GENERATOR_H_ |
| OLD | NEW |