| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_HEAP_MARK_COMPACT_H_ | 5 #ifndef V8_HEAP_MARK_COMPACT_H_ |
| 6 #define V8_HEAP_MARK_COMPACT_H_ | 6 #define V8_HEAP_MARK_COMPACT_H_ |
| 7 | 7 |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/heap/spaces.h" | 9 #include "src/heap/spaces.h" |
| 10 | 10 |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 void RecordCodeEntrySlot(HeapObject* object, Address slot, Code* target); | 420 void RecordCodeEntrySlot(HeapObject* object, Address slot, Code* target); |
| 421 void RecordCodeTargetPatch(Address pc, Code* target); | 421 void RecordCodeTargetPatch(Address pc, Code* target); |
| 422 INLINE(void RecordSlot(HeapObject* object, Object** slot, Object* target)); | 422 INLINE(void RecordSlot(HeapObject* object, Object** slot, Object* target)); |
| 423 INLINE(void ForceRecordSlot(HeapObject* object, Object** slot, | 423 INLINE(void ForceRecordSlot(HeapObject* object, Object** slot, |
| 424 Object* target)); | 424 Object* target)); |
| 425 | 425 |
| 426 void UpdateSlots(SlotsBuffer* buffer); | 426 void UpdateSlots(SlotsBuffer* buffer); |
| 427 void UpdateSlotsRecordedIn(SlotsBuffer* buffer); | 427 void UpdateSlotsRecordedIn(SlotsBuffer* buffer); |
| 428 | 428 |
| 429 void MigrateObject(HeapObject* dst, HeapObject* src, int size, | 429 void MigrateObject(HeapObject* dst, HeapObject* src, int size, |
| 430 AllocationSpace to_old_space); | 430 AllocationSpace to_old_space, |
| 431 SlotsBuffer** evacuation_slots_buffer); |
| 431 | 432 |
| 432 void MigrateObjectTagged(HeapObject* dst, HeapObject* src, int size); | 433 void MigrateObjectTagged(HeapObject* dst, HeapObject* src, int size, |
| 433 void MigrateObjectMixed(HeapObject* dst, HeapObject* src, int size); | 434 SlotsBuffer** evacuation_slots_buffer); |
| 435 void MigrateObjectMixed(HeapObject* dst, HeapObject* src, int size, |
| 436 SlotsBuffer** evacuation_slots_buffer); |
| 434 void MigrateObjectRaw(HeapObject* dst, HeapObject* src, int size); | 437 void MigrateObjectRaw(HeapObject* dst, HeapObject* src, int size); |
| 435 | 438 |
| 436 bool TryPromoteObject(HeapObject* object, int object_size); | 439 bool TryPromoteObject(HeapObject* object, int object_size); |
| 437 | 440 |
| 438 void InvalidateCode(Code* code); | 441 void InvalidateCode(Code* code); |
| 439 | 442 |
| 440 void ClearMarkbits(); | 443 void ClearMarkbits(); |
| 441 | 444 |
| 442 bool is_compacting() const { return compacting_; } | 445 bool is_compacting() const { return compacting_; } |
| 443 | 446 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 | 562 |
| 560 // Number of active compaction tasks (including main thread). | 563 // Number of active compaction tasks (including main thread). |
| 561 intptr_t concurrent_compaction_tasks_active_; | 564 intptr_t concurrent_compaction_tasks_active_; |
| 562 | 565 |
| 563 bool evacuation_; | 566 bool evacuation_; |
| 564 | 567 |
| 565 SlotsBufferAllocator* slots_buffer_allocator_; | 568 SlotsBufferAllocator* slots_buffer_allocator_; |
| 566 | 569 |
| 567 SlotsBuffer* migration_slots_buffer_; | 570 SlotsBuffer* migration_slots_buffer_; |
| 568 | 571 |
| 569 base::Mutex migration_slots_buffer_mutex_; | |
| 570 | |
| 571 // Finishes GC, performs heap verification if enabled. | 572 // Finishes GC, performs heap verification if enabled. |
| 572 void Finish(); | 573 void Finish(); |
| 573 | 574 |
| 574 // ----------------------------------------------------------------------- | 575 // ----------------------------------------------------------------------- |
| 575 // Phase 1: Marking live objects. | 576 // Phase 1: Marking live objects. |
| 576 // | 577 // |
| 577 // Before: The heap has been prepared for garbage collection by | 578 // Before: The heap has been prepared for garbage collection by |
| 578 // MarkCompactCollector::Prepare() and is otherwise in its | 579 // MarkCompactCollector::Prepare() and is otherwise in its |
| 579 // normal state. | 580 // normal state. |
| 580 // | 581 // |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 // If we are not compacting the heap, we simply sweep the spaces except | 710 // If we are not compacting the heap, we simply sweep the spaces except |
| 710 // for the large object space, clearing mark bits and adding unmarked | 711 // for the large object space, clearing mark bits and adding unmarked |
| 711 // regions to each space's free list. | 712 // regions to each space's free list. |
| 712 void SweepSpaces(); | 713 void SweepSpaces(); |
| 713 | 714 |
| 714 int DiscoverAndEvacuateBlackObjectsOnPage(NewSpace* new_space, | 715 int DiscoverAndEvacuateBlackObjectsOnPage(NewSpace* new_space, |
| 715 NewSpacePage* p); | 716 NewSpacePage* p); |
| 716 | 717 |
| 717 void EvacuateNewSpace(); | 718 void EvacuateNewSpace(); |
| 718 | 719 |
| 719 bool EvacuateLiveObjectsFromPage(Page* p, PagedSpace* target_space); | 720 bool EvacuateLiveObjectsFromPage(Page* p, PagedSpace* target_space, |
| 721 SlotsBuffer** evacuation_slots_buffer); |
| 720 | 722 |
| 721 void EvacuatePages(CompactionSpaceCollection* compaction_spaces); | 723 void AddEvacuationSlotsBufferSynchronized( |
| 724 SlotsBuffer* evacuation_slots_buffer); |
| 725 |
| 726 void EvacuatePages(CompactionSpaceCollection* compaction_spaces, |
| 727 SlotsBuffer** evacuation_slots_buffer); |
| 728 |
| 722 void EvacuatePagesInParallel(); | 729 void EvacuatePagesInParallel(); |
| 723 | 730 |
| 724 int NumberOfParallelCompactionTasks() { | 731 int NumberOfParallelCompactionTasks() { |
| 725 // TODO(hpayer, mlippautz): Figure out some logic to determine the number | 732 // TODO(hpayer, mlippautz): Figure out some logic to determine the number |
| 726 // of compaction tasks. | 733 // of compaction tasks. |
| 727 return 1; | 734 return 1; |
| 728 } | 735 } |
| 729 | 736 |
| 730 void WaitUntilCompactionCompleted(); | 737 void WaitUntilCompactionCompleted(); |
| 731 | 738 |
| 732 void EvacuateNewSpaceAndCandidates(); | 739 void EvacuateNewSpaceAndCandidates(); |
| 733 | 740 |
| 734 void ReleaseEvacuationCandidates(); | 741 void ReleaseEvacuationCandidates(); |
| 735 | 742 |
| 736 // Moves the pages of the evacuation_candidates_ list to the end of their | 743 // Moves the pages of the evacuation_candidates_ list to the end of their |
| 737 // corresponding space pages list. | 744 // corresponding space pages list. |
| 738 void MoveEvacuationCandidatesToEndOfPagesList(); | 745 void MoveEvacuationCandidatesToEndOfPagesList(); |
| 739 | 746 |
| 740 void SweepSpace(PagedSpace* space, SweeperType sweeper); | 747 void SweepSpace(PagedSpace* space, SweeperType sweeper); |
| 741 | 748 |
| 742 // Finalizes the parallel sweeping phase. Marks all the pages that were | 749 // Finalizes the parallel sweeping phase. Marks all the pages that were |
| 743 // swept in parallel. | 750 // swept in parallel. |
| 744 void ParallelSweepSpacesComplete(); | 751 void ParallelSweepSpacesComplete(); |
| 745 | 752 |
| 746 void ParallelSweepSpaceComplete(PagedSpace* space); | 753 void ParallelSweepSpaceComplete(PagedSpace* space); |
| 747 | 754 |
| 748 // Updates store buffer and slot buffer for a pointer in a migrating object. | 755 // Updates store buffer and slot buffer for a pointer in a migrating object. |
| 749 void RecordMigratedSlot(Object* value, Address slot); | 756 void RecordMigratedSlot(Object* value, Address slot, |
| 757 SlotsBuffer** evacuation_slots_buffer); |
| 750 | 758 |
| 751 // Adds the code entry slot to the slots buffer. | 759 // Adds the code entry slot to the slots buffer. |
| 752 void RecordMigratedCodeEntrySlot(Address code_entry, Address code_entry_slot); | 760 void RecordMigratedCodeEntrySlot(Address code_entry, Address code_entry_slot, |
| 761 SlotsBuffer** evacuation_slots_buffer); |
| 753 | 762 |
| 754 // Adds the slot of a moved code object. | 763 // Adds the slot of a moved code object. |
| 755 void RecordMigratedCodeObjectSlot(Address code_object); | 764 void RecordMigratedCodeObjectSlot(Address code_object, |
| 765 SlotsBuffer** evacuation_slots_buffer); |
| 756 | 766 |
| 757 #ifdef DEBUG | 767 #ifdef DEBUG |
| 758 friend class MarkObjectVisitor; | 768 friend class MarkObjectVisitor; |
| 759 static void VisitObject(HeapObject* obj); | 769 static void VisitObject(HeapObject* obj); |
| 760 | 770 |
| 761 friend class UnmarkObjectVisitor; | 771 friend class UnmarkObjectVisitor; |
| 762 static void UnmarkObject(HeapObject* obj); | 772 static void UnmarkObject(HeapObject* obj); |
| 763 #endif | 773 #endif |
| 764 | 774 |
| 765 Heap* heap_; | 775 Heap* heap_; |
| 766 base::VirtualMemory* marking_deque_memory_; | 776 base::VirtualMemory* marking_deque_memory_; |
| 767 size_t marking_deque_memory_committed_; | 777 size_t marking_deque_memory_committed_; |
| 768 MarkingDeque marking_deque_; | 778 MarkingDeque marking_deque_; |
| 769 CodeFlusher* code_flusher_; | 779 CodeFlusher* code_flusher_; |
| 770 bool have_code_to_deoptimize_; | 780 bool have_code_to_deoptimize_; |
| 771 | 781 |
| 772 List<Page*> evacuation_candidates_; | 782 List<Page*> evacuation_candidates_; |
| 773 | 783 |
| 784 // The evacuation_slots_buffers_ are used by the compaction threads. |
| 785 // When a compaction task finishes, it uses |
| 786 // AddEvacuationSlotsbufferSynchronized to adds its slots buffer to the |
| 787 // evacuation_slots_buffers_ list using the evacuation_slots_buffers_mutex_ |
| 788 // lock. |
| 789 base::Mutex evacuation_slots_buffers_mutex_; |
| 790 List<SlotsBuffer*> evacuation_slots_buffers_; |
| 791 |
| 774 base::SmartPointer<FreeList> free_list_old_space_; | 792 base::SmartPointer<FreeList> free_list_old_space_; |
| 775 base::SmartPointer<FreeList> free_list_code_space_; | 793 base::SmartPointer<FreeList> free_list_code_space_; |
| 776 base::SmartPointer<FreeList> free_list_map_space_; | 794 base::SmartPointer<FreeList> free_list_map_space_; |
| 777 | 795 |
| 778 friend class Heap; | 796 friend class Heap; |
| 779 }; | 797 }; |
| 780 | 798 |
| 781 | 799 |
| 782 class MarkBitCellIterator BASE_EMBEDDED { | 800 class MarkBitCellIterator BASE_EMBEDDED { |
| 783 public: | 801 public: |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 private: | 850 private: |
| 833 MarkCompactCollector* collector_; | 851 MarkCompactCollector* collector_; |
| 834 }; | 852 }; |
| 835 | 853 |
| 836 | 854 |
| 837 const char* AllocationSpaceName(AllocationSpace space); | 855 const char* AllocationSpaceName(AllocationSpace space); |
| 838 } | 856 } |
| 839 } // namespace v8::internal | 857 } // namespace v8::internal |
| 840 | 858 |
| 841 #endif // V8_HEAP_MARK_COMPACT_H_ | 859 #endif // V8_HEAP_MARK_COMPACT_H_ |
| OLD | NEW |