| 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 <deque> | 8 #include <deque> |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| 11 #include "src/base/platform/condition-variable.h" | 11 #include "src/base/platform/condition-variable.h" |
| 12 #include "src/cancelable-task.h" | 12 #include "src/cancelable-task.h" |
| 13 #include "src/heap/marking.h" | 13 #include "src/heap/marking.h" |
| 14 #include "src/heap/spaces.h" | 14 #include "src/heap/spaces.h" |
| 15 #include "src/heap/store-buffer.h" | 15 #include "src/heap/store-buffer.h" |
| 16 | 16 |
| 17 namespace v8 { | 17 namespace v8 { |
| 18 namespace internal { | 18 namespace internal { |
| 19 | 19 |
| 20 // Forward declarations. | 20 // Forward declarations. |
| 21 class CodeFlusher; | 21 class CodeFlusher; |
| 22 class EvacuationJobTraits; |
| 22 class HeapObjectVisitor; | 23 class HeapObjectVisitor; |
| 23 class MarkCompactCollector; | 24 class MarkCompactCollector; |
| 24 class MinorMarkCompactCollector; | 25 class MinorMarkCompactCollector; |
| 25 class MarkingVisitor; | 26 class MarkingVisitor; |
| 27 class MigrationObserver; |
| 28 template <typename JobTraits> |
| 29 class PageParallelJob; |
| 30 class RecordMigratedSlotVisitor; |
| 26 class ThreadLocalTop; | 31 class ThreadLocalTop; |
| 27 | 32 |
| 28 class ObjectMarking : public AllStatic { | 33 class ObjectMarking : public AllStatic { |
| 29 public: | 34 public: |
| 30 V8_INLINE static MarkBit MarkBitFrom(HeapObject* obj, | 35 V8_INLINE static MarkBit MarkBitFrom(HeapObject* obj, |
| 31 const MarkingState& state) { | 36 const MarkingState& state) { |
| 32 const Address address = obj->address(); | 37 const Address address = obj->address(); |
| 33 const MemoryChunk* p = MemoryChunk::FromAddress(address); | 38 const MemoryChunk* p = MemoryChunk::FromAddress(address); |
| 34 return state.bitmap()->MarkBitFromIndex(p->AddressToMarkbitIndex(address)); | 39 return state.bitmap()->MarkBitFromIndex(p->AddressToMarkbitIndex(address)); |
| 35 } | 40 } |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 virtual void TearDown() = 0; | 433 virtual void TearDown() = 0; |
| 429 virtual void CollectGarbage() = 0; | 434 virtual void CollectGarbage() = 0; |
| 430 | 435 |
| 431 inline Heap* heap() const { return heap_; } | 436 inline Heap* heap() const { return heap_; } |
| 432 inline Isolate* isolate() { return heap()->isolate(); } | 437 inline Isolate* isolate() { return heap()->isolate(); } |
| 433 | 438 |
| 434 protected: | 439 protected: |
| 435 explicit MarkCompactCollectorBase(Heap* heap) : heap_(heap) {} | 440 explicit MarkCompactCollectorBase(Heap* heap) : heap_(heap) {} |
| 436 | 441 |
| 437 virtual void MarkLiveObjects() = 0; | 442 virtual void MarkLiveObjects() = 0; |
| 443 virtual void UpdatePointersAfterEvacuation() = 0; |
| 438 | 444 |
| 439 // The number of parallel compaction tasks, including the main thread. | 445 // The number of parallel compaction tasks, including the main thread. |
| 440 int NumberOfParallelCompactionTasks(int pages, intptr_t live_bytes); | 446 int NumberOfParallelCompactionTasks(int pages, intptr_t live_bytes); |
| 441 | 447 |
| 448 template <class Evacuator, class Collector> |
| 449 void CreateAndExecuteEvacuationTasks( |
| 450 Collector* collector, PageParallelJob<EvacuationJobTraits>* job, |
| 451 RecordMigratedSlotVisitor* record_visitor, MigrationObserver* observer, |
| 452 const intptr_t live_bytes, const int& abandoned_pages); |
| 453 |
| 442 Heap* heap_; | 454 Heap* heap_; |
| 443 }; | 455 }; |
| 444 | 456 |
| 445 // Collector for young-generation only. | 457 // Collector for young-generation only. |
| 446 class MinorMarkCompactCollector final : public MarkCompactCollectorBase { | 458 class MinorMarkCompactCollector final : public MarkCompactCollectorBase { |
| 447 public: | 459 public: |
| 448 explicit MinorMarkCompactCollector(Heap* heap) | 460 explicit MinorMarkCompactCollector(Heap* heap) |
| 449 : MarkCompactCollectorBase(heap), marking_deque_(heap) {} | 461 : MarkCompactCollectorBase(heap), |
| 462 marking_deque_(heap), |
| 463 page_parallel_job_semaphore_(0) {} |
| 450 | 464 |
| 451 MarkingState marking_state(HeapObject* object) const override { | 465 MarkingState marking_state(HeapObject* object) const override { |
| 452 return MarkingState::External(object); | 466 return MarkingState::External(object); |
| 453 } | 467 } |
| 454 | 468 |
| 455 MarkingState marking_state(MemoryChunk* chunk) const override { | 469 MarkingState marking_state(MemoryChunk* chunk) const override { |
| 456 return MarkingState::External(chunk); | 470 return MarkingState::External(chunk); |
| 457 } | 471 } |
| 458 | 472 |
| 459 void SetUp() override; | 473 void SetUp() override; |
| 460 void TearDown() override; | 474 void TearDown() override; |
| 461 void CollectGarbage() override; | 475 void CollectGarbage() override; |
| 462 | 476 |
| 463 private: | 477 private: |
| 464 class RootMarkingVisitor; | 478 class RootMarkingVisitor; |
| 465 | 479 |
| 466 inline MarkingDeque* marking_deque() { return &marking_deque_; } | 480 inline MarkingDeque* marking_deque() { return &marking_deque_; } |
| 467 | 481 |
| 468 V8_INLINE void MarkObject(HeapObject* obj); | 482 V8_INLINE void MarkObject(HeapObject* obj); |
| 469 V8_INLINE void PushBlack(HeapObject* obj); | 483 V8_INLINE void PushBlack(HeapObject* obj); |
| 470 | 484 |
| 471 SlotCallbackResult CheckAndMarkObject(Heap* heap, Address slot_address); | 485 SlotCallbackResult CheckAndMarkObject(Heap* heap, Address slot_address); |
| 472 void MarkLiveObjects() override; | 486 void MarkLiveObjects() override; |
| 473 void ProcessMarkingDeque(); | 487 void ProcessMarkingDeque(); |
| 474 void EmptyMarkingDeque(); | 488 void EmptyMarkingDeque(); |
| 489 void ClearNonLiveReferences(); |
| 490 |
| 491 void EvacuatePrologue(); |
| 492 void EvacuateEpilogue(); |
| 493 void EvacuateNewSpace(std::vector<HeapObject*>* black_allocation_objects); |
| 494 void EvacuatePagesInParallel( |
| 495 std::vector<HeapObject*>* black_allocation_objects); |
| 496 void UpdatePointersAfterEvacuation() override; |
| 475 | 497 |
| 476 MarkingDeque marking_deque_; | 498 MarkingDeque marking_deque_; |
| 499 base::Semaphore page_parallel_job_semaphore_; |
| 500 List<Page*> new_space_evacuation_pages_; |
| 477 | 501 |
| 478 friend class StaticYoungGenerationMarkingVisitor; | 502 friend class StaticYoungGenerationMarkingVisitor; |
| 479 }; | 503 }; |
| 480 | 504 |
| 481 // Collector for young and old generation. | 505 // Collector for young and old generation. |
| 482 class MarkCompactCollector final : public MarkCompactCollectorBase { | 506 class MarkCompactCollector final : public MarkCompactCollectorBase { |
| 483 public: | 507 public: |
| 484 class RootMarkingVisitor; | 508 class RootMarkingVisitor; |
| 485 | 509 |
| 486 class Sweeper { | 510 class Sweeper { |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 // up other pages for sweeping. Does not start sweeper tasks. | 809 // up other pages for sweeping. Does not start sweeper tasks. |
| 786 void StartSweepSpaces(); | 810 void StartSweepSpaces(); |
| 787 void StartSweepSpace(PagedSpace* space); | 811 void StartSweepSpace(PagedSpace* space); |
| 788 | 812 |
| 789 void EvacuatePrologue(); | 813 void EvacuatePrologue(); |
| 790 void EvacuateEpilogue(); | 814 void EvacuateEpilogue(); |
| 791 void EvacuatePagesInParallel(); | 815 void EvacuatePagesInParallel(); |
| 792 | 816 |
| 793 void EvacuateNewSpaceAndCandidates(); | 817 void EvacuateNewSpaceAndCandidates(); |
| 794 | 818 |
| 795 void UpdatePointersAfterEvacuation(); | 819 void UpdatePointersAfterEvacuation() override; |
| 796 | 820 |
| 797 void ReleaseEvacuationCandidates(); | 821 void ReleaseEvacuationCandidates(); |
| 798 | 822 |
| 799 base::Semaphore page_parallel_job_semaphore_; | 823 base::Semaphore page_parallel_job_semaphore_; |
| 800 | 824 |
| 801 #ifdef DEBUG | 825 #ifdef DEBUG |
| 802 enum CollectorState { | 826 enum CollectorState { |
| 803 IDLE, | 827 IDLE, |
| 804 PREPARE_GC, | 828 PREPARE_GC, |
| 805 MARK_LIVE_OBJECTS, | 829 MARK_LIVE_OBJECTS, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 ~EvacuationScope() { collector_->set_evacuation(false); } | 882 ~EvacuationScope() { collector_->set_evacuation(false); } |
| 859 | 883 |
| 860 private: | 884 private: |
| 861 MarkCompactCollector* collector_; | 885 MarkCompactCollector* collector_; |
| 862 }; | 886 }; |
| 863 | 887 |
| 864 } // namespace internal | 888 } // namespace internal |
| 865 } // namespace v8 | 889 } // namespace v8 |
| 866 | 890 |
| 867 #endif // V8_HEAP_MARK_COMPACT_H_ | 891 #endif // V8_HEAP_MARK_COMPACT_H_ |
| OLD | NEW |