Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: src/heap/mark-compact.h

Issue 1341973003: [heap] Scalable slots buffer for parallel compaction. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/heap/mark-compact.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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_
OLDNEW
« no previous file with comments | « no previous file | src/heap/mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698