| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_HEAP_CPPGC_CONCURRENT_MARKER_H_ |
| #define V8_HEAP_CPPGC_CONCURRENT_MARKER_H_ |
| |
| #include "include/cppgc/platform.h" |
| #include "src/heap/cppgc/incremental-marking-schedule.h" |
| #include "src/heap/cppgc/marking-state.h" |
| #include "src/heap/cppgc/marking-visitor.h" |
| #include "src/heap/cppgc/marking-worklists.h" |
| |
| namespace cppgc { |
| namespace internal { |
| |
| class V8_EXPORT_PRIVATE ConcurrentMarkerBase { |
| public: |
| ConcurrentMarkerBase(HeapBase&, MarkingWorklists&, |
| IncrementalMarkingSchedule&, cppgc::Platform*); |
| virtual ~ConcurrentMarkerBase(); |
| |
| ConcurrentMarkerBase(const ConcurrentMarkerBase&) = delete; |
| ConcurrentMarkerBase& operator=(const ConcurrentMarkerBase&) = delete; |
| |
| void Start(); |
| void Cancel(); |
| |
| void JoinForTesting(); |
| |
| bool NotifyIncrementalMutatorStepCompleted(); |
| |
| bool IsActive() const; |
| |
| HeapBase& heap() const { return heap_; } |
| MarkingWorklists& marking_worklists() const { return marking_worklists_; } |
| IncrementalMarkingSchedule& incremental_marking_schedule() const { |
| return incremental_marking_schedule_; |
| } |
| |
| virtual std::unique_ptr<Visitor> CreateConcurrentMarkingVisitor( |
| ConcurrentMarkingState&) const = 0; |
| |
| protected: |
| void IncreaseMarkingPriorityIfNeeded(); |
| |
| private: |
| HeapBase& heap_; |
| MarkingWorklists& marking_worklists_; |
| IncrementalMarkingSchedule& incremental_marking_schedule_; |
| cppgc::Platform* const platform_; |
| |
| // The job handle doubles as flag to denote concurrent marking was started. |
| std::unique_ptr<JobHandle> concurrent_marking_handle_{nullptr}; |
| |
| size_t last_concurrently_marked_bytes_ = 0; |
| v8::base::TimeTicks last_concurrently_marked_bytes_update_; |
| bool concurrent_marking_priority_increased_{false}; |
| }; |
| |
| class V8_EXPORT_PRIVATE ConcurrentMarker : public ConcurrentMarkerBase { |
| public: |
| ConcurrentMarker(HeapBase& heap, MarkingWorklists& marking_worklists, |
| IncrementalMarkingSchedule& incremental_marking_schedule, |
| cppgc::Platform* platform) |
| : ConcurrentMarkerBase(heap, marking_worklists, |
| incremental_marking_schedule, platform) {} |
| |
| std::unique_ptr<Visitor> CreateConcurrentMarkingVisitor( |
| ConcurrentMarkingState&) const final; |
| }; |
| |
| } // namespace internal |
| } // namespace cppgc |
| |
| #endif // V8_HEAP_CPPGC_CONCURRENT_MARKER_H_ |