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

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

Issue 1640563004: Reland of "[heap] Parallel newspace evacuation, semispace copy, and compaction \o/" (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Convert bogus DCHECK into proper branch Created 4 years, 11 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 | « src/heap/heap-inl.h ('k') | 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 #include "src/heap/store-buffer.h"
10 11
11 namespace v8 { 12 namespace v8 {
12 namespace internal { 13 namespace internal {
13 14
14 // Callback function, returns whether an object is alive. The heap size 15 // Callback function, returns whether an object is alive. The heap size
15 // of the object is returned in size. It optionally updates the offset 16 // of the object is returned in size. It optionally updates the offset
16 // to the first live object in the page (only used for old and map objects). 17 // to the first live object in the page (only used for old and map objects).
17 typedef bool (*IsAliveFunction)(HeapObject* obj, int* size, int* offset); 18 typedef bool (*IsAliveFunction)(HeapObject* obj, int* size, int* offset);
18 19
19 // Callback function to mark an object in a given heap. 20 // Callback function to mark an object in a given heap.
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 void RecordCodeTargetPatch(Address pc, Code* target); 400 void RecordCodeTargetPatch(Address pc, Code* target);
400 INLINE(void RecordSlot(HeapObject* object, Object** slot, Object* target)); 401 INLINE(void RecordSlot(HeapObject* object, Object** slot, Object* target));
401 INLINE(void ForceRecordSlot(HeapObject* object, Object** slot, 402 INLINE(void ForceRecordSlot(HeapObject* object, Object** slot,
402 Object* target)); 403 Object* target));
403 404
404 void UpdateSlots(SlotsBuffer* buffer); 405 void UpdateSlots(SlotsBuffer* buffer);
405 void UpdateSlotsRecordedIn(SlotsBuffer* buffer); 406 void UpdateSlotsRecordedIn(SlotsBuffer* buffer);
406 407
407 void MigrateObject(HeapObject* dst, HeapObject* src, int size, 408 void MigrateObject(HeapObject* dst, HeapObject* src, int size,
408 AllocationSpace to_old_space, 409 AllocationSpace to_old_space,
409 SlotsBuffer** evacuation_slots_buffer); 410 SlotsBuffer** evacuation_slots_buffer,
411 LocalStoreBuffer* local_store_buffer);
410 412
411 void InvalidateCode(Code* code); 413 void InvalidateCode(Code* code);
412 414
413 void ClearMarkbits(); 415 void ClearMarkbits();
414 416
415 bool is_compacting() const { return compacting_; } 417 bool is_compacting() const { return compacting_; }
416 418
417 MarkingParity marking_parity() { return marking_parity_; } 419 MarkingParity marking_parity() { return marking_parity_; }
418 420
419 // Concurrent and parallel sweeping support. If required_freed_bytes was set 421 // Concurrent and parallel sweeping support. If required_freed_bytes was set
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 } 504 }
503 base::SmartPointer<FreeList>& free_list_map_space() { 505 base::SmartPointer<FreeList>& free_list_map_space() {
504 return free_list_map_space_; 506 return free_list_map_space_;
505 } 507 }
506 508
507 private: 509 private:
508 class CompactionTask; 510 class CompactionTask;
509 class EvacuateNewSpaceVisitor; 511 class EvacuateNewSpaceVisitor;
510 class EvacuateOldSpaceVisitor; 512 class EvacuateOldSpaceVisitor;
511 class EvacuateVisitorBase; 513 class EvacuateVisitorBase;
514 class Evacuator;
512 class HeapObjectVisitor; 515 class HeapObjectVisitor;
513 class SweeperTask; 516 class SweeperTask;
514 517
515 typedef std::vector<Page*> SweepingList; 518 typedef std::vector<Page*> SweepingList;
516 519
517 static const int kInitialLocalPretenuringFeedbackCapacity = 256;
518
519 explicit MarkCompactCollector(Heap* heap); 520 explicit MarkCompactCollector(Heap* heap);
520 521
521 bool WillBeDeoptimized(Code* code); 522 bool WillBeDeoptimized(Code* code);
522 void EvictPopularEvacuationCandidate(Page* page); 523 void EvictPopularEvacuationCandidate(Page* page);
523 void ClearInvalidStoreAndSlotsBufferEntries(); 524 void ClearInvalidStoreAndSlotsBufferEntries();
524 525
525 void StartSweeperThreads(); 526 void StartSweeperThreads();
526 527
527 void ComputeEvacuationHeuristics(int area_size, 528 void ComputeEvacuationHeuristics(int area_size,
528 int* target_fragmentation_percent, 529 int* target_fragmentation_percent,
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 // 698 //
698 699
699 inline SweepingList& sweeping_list(Space* space); 700 inline SweepingList& sweeping_list(Space* space);
700 701
701 // If we are not compacting the heap, we simply sweep the spaces except 702 // If we are not compacting the heap, we simply sweep the spaces except
702 // for the large object space, clearing mark bits and adding unmarked 703 // for the large object space, clearing mark bits and adding unmarked
703 // regions to each space's free list. 704 // regions to each space's free list.
704 void SweepSpaces(); 705 void SweepSpaces();
705 706
706 void EvacuateNewSpacePrologue(); 707 void EvacuateNewSpacePrologue();
707 708 void EvacuateNewSpaceEpilogue();
708 // Returns local pretenuring feedback.
709 HashMap* EvacuateNewSpaceInParallel();
710 709
711 void AddEvacuationSlotsBufferSynchronized( 710 void AddEvacuationSlotsBufferSynchronized(
712 SlotsBuffer* evacuation_slots_buffer); 711 SlotsBuffer* evacuation_slots_buffer);
713 712
714 void EvacuatePages(CompactionSpaceCollection* compaction_spaces,
715 SlotsBuffer** evacuation_slots_buffer);
716
717 void EvacuatePagesInParallel(); 713 void EvacuatePagesInParallel();
718 714
719 // The number of parallel compaction tasks, including the main thread. 715 // The number of parallel compaction tasks, including the main thread.
720 int NumberOfParallelCompactionTasks(); 716 int NumberOfParallelCompactionTasks(int pages, intptr_t live_bytes);
721 717
722 718 void StartParallelCompaction(Evacuator** evacuators, int len);
723 void StartParallelCompaction(CompactionSpaceCollection** compaction_spaces, 719 void WaitUntilCompactionCompleted(Evacuator** evacuators, int len);
724 uint32_t* task_ids, int len);
725 void WaitUntilCompactionCompleted(uint32_t* task_ids, int len);
726 720
727 void EvacuateNewSpaceAndCandidates(); 721 void EvacuateNewSpaceAndCandidates();
728 722
729 void UpdatePointersAfterEvacuation(); 723 void UpdatePointersAfterEvacuation();
730 724
731 // Iterates through all live objects on a page using marking information. 725 // Iterates through all live objects on a page using marking information.
732 // Returns whether all objects have successfully been visited. 726 // Returns whether all objects have successfully been visited.
733 bool VisitLiveObjects(MemoryChunk* page, HeapObjectVisitor* visitor, 727 bool VisitLiveObjects(MemoryChunk* page, HeapObjectVisitor* visitor,
734 IterationMode mode); 728 IterationMode mode);
735 729
736 void VisitLiveObjectsBody(Page* page, ObjectVisitor* visitor); 730 void VisitLiveObjectsBody(Page* page, ObjectVisitor* visitor);
737 731
738 void RecomputeLiveBytes(MemoryChunk* page); 732 void RecomputeLiveBytes(MemoryChunk* page);
739 733
740 void SweepAbortedPages(); 734 void SweepAbortedPages();
741 735
742 void ReleaseEvacuationCandidates(); 736 void ReleaseEvacuationCandidates();
743 737
744 // Starts sweeping of a space by contributing on the main thread and setting 738 // Starts sweeping of a space by contributing on the main thread and setting
745 // up other pages for sweeping. 739 // up other pages for sweeping.
746 void StartSweepSpace(PagedSpace* space); 740 void StartSweepSpace(PagedSpace* space);
747 741
748 // Finalizes the parallel sweeping phase. Marks all the pages that were 742 // Finalizes the parallel sweeping phase. Marks all the pages that were
749 // swept in parallel. 743 // swept in parallel.
750 void ParallelSweepSpacesComplete(); 744 void ParallelSweepSpacesComplete();
751 745
752 // Updates store buffer and slot buffer for a pointer in a migrating object. 746 // Updates store buffer and slot buffer for a pointer in a migrating object.
753 void RecordMigratedSlot(Object* value, Address slot, 747 void RecordMigratedSlot(Object* value, Address slot,
754 SlotsBuffer** evacuation_slots_buffer); 748 SlotsBuffer** evacuation_slots_buffer,
749 LocalStoreBuffer* local_store_buffer);
755 750
756 // Adds the code entry slot to the slots buffer. 751 // Adds the code entry slot to the slots buffer.
757 void RecordMigratedCodeEntrySlot(Address code_entry, Address code_entry_slot, 752 void RecordMigratedCodeEntrySlot(Address code_entry, Address code_entry_slot,
758 SlotsBuffer** evacuation_slots_buffer); 753 SlotsBuffer** evacuation_slots_buffer);
759 754
760 // Adds the slot of a moved code object. 755 // Adds the slot of a moved code object.
761 void RecordMigratedCodeObjectSlot(Address code_object, 756 void RecordMigratedCodeObjectSlot(Address code_object,
762 SlotsBuffer** evacuation_slots_buffer); 757 SlotsBuffer** evacuation_slots_buffer);
763 758
764 #ifdef DEBUG 759 #ifdef DEBUG
765 friend class MarkObjectVisitor; 760 friend class MarkObjectVisitor;
766 static void VisitObject(HeapObject* obj); 761 static void VisitObject(HeapObject* obj);
767 762
768 friend class UnmarkObjectVisitor; 763 friend class UnmarkObjectVisitor;
769 static void UnmarkObject(HeapObject* obj); 764 static void UnmarkObject(HeapObject* obj);
770 #endif 765 #endif
771 766
772 Heap* heap_; 767 Heap* heap_;
773 base::VirtualMemory* marking_deque_memory_; 768 base::VirtualMemory* marking_deque_memory_;
774 size_t marking_deque_memory_committed_; 769 size_t marking_deque_memory_committed_;
775 MarkingDeque marking_deque_; 770 MarkingDeque marking_deque_;
776 CodeFlusher* code_flusher_; 771 CodeFlusher* code_flusher_;
777 bool have_code_to_deoptimize_; 772 bool have_code_to_deoptimize_;
778 773
779 List<Page*> evacuation_candidates_; 774 List<Page*> evacuation_candidates_;
780 775 List<NewSpacePage*> newspace_evacuation_candidates_;
781 List<MemoryChunk*> newspace_evacuation_candidates_;
782 776
783 // The evacuation_slots_buffers_ are used by the compaction threads. 777 // The evacuation_slots_buffers_ are used by the compaction threads.
784 // When a compaction task finishes, it uses 778 // When a compaction task finishes, it uses
785 // AddEvacuationSlotsbufferSynchronized to adds its slots buffer to the 779 // AddEvacuationSlotsbufferSynchronized to adds its slots buffer to the
786 // evacuation_slots_buffers_ list using the evacuation_slots_buffers_mutex_ 780 // evacuation_slots_buffers_ list using the evacuation_slots_buffers_mutex_
787 // lock. 781 // lock.
788 base::Mutex evacuation_slots_buffers_mutex_; 782 base::Mutex evacuation_slots_buffers_mutex_;
789 List<SlotsBuffer*> evacuation_slots_buffers_; 783 List<SlotsBuffer*> evacuation_slots_buffers_;
790 784
791 base::SmartPointer<FreeList> free_list_old_space_; 785 base::SmartPointer<FreeList> free_list_old_space_;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 private: 892 private:
899 MarkCompactCollector* collector_; 893 MarkCompactCollector* collector_;
900 }; 894 };
901 895
902 896
903 const char* AllocationSpaceName(AllocationSpace space); 897 const char* AllocationSpaceName(AllocationSpace space);
904 } // namespace internal 898 } // namespace internal
905 } // namespace v8 899 } // namespace v8
906 900
907 #endif // V8_HEAP_MARK_COMPACT_H_ 901 #endif // V8_HEAP_MARK_COMPACT_H_
OLDNEW
« no previous file with comments | « src/heap/heap-inl.h ('k') | src/heap/mark-compact.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698