|  | // 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_HEAP_BASE_H_ | 
|  | #define V8_HEAP_CPPGC_HEAP_BASE_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <set> | 
|  |  | 
|  | #include "include/cppgc/heap.h" | 
|  | #include "include/cppgc/internal/persistent-node.h" | 
|  | #include "include/cppgc/macros.h" | 
|  | #include "src/base/macros.h" | 
|  | #include "src/heap/cppgc/compactor.h" | 
|  | #include "src/heap/cppgc/marker.h" | 
|  | #include "src/heap/cppgc/object-allocator.h" | 
|  | #include "src/heap/cppgc/raw-heap.h" | 
|  | #include "src/heap/cppgc/sweeper.h" | 
|  |  | 
|  | #if defined(CPPGC_CAGED_HEAP) | 
|  | #include "src/heap/cppgc/caged-heap.h" | 
|  | #endif | 
|  |  | 
|  | namespace heap { | 
|  | namespace base { | 
|  | class Stack; | 
|  | }  // namespace base | 
|  | }  // namespace heap | 
|  |  | 
|  | namespace cppgc { | 
|  |  | 
|  | class Platform; | 
|  |  | 
|  | namespace internal { | 
|  |  | 
|  | namespace testing { | 
|  | class TestWithHeap; | 
|  | }  // namespace testing | 
|  |  | 
|  | class PageBackend; | 
|  | class PreFinalizerHandler; | 
|  | class StatsCollector; | 
|  |  | 
|  | // Base class for heap implementations. | 
|  | class V8_EXPORT_PRIVATE HeapBase { | 
|  | public: | 
|  | using StackSupport = cppgc::Heap::StackSupport; | 
|  |  | 
|  | // NoGCScope allows going over limits and avoids triggering garbage | 
|  | // collection triggered through allocations or even explicitly. | 
|  | class V8_EXPORT_PRIVATE NoGCScope final { | 
|  | CPPGC_STACK_ALLOCATED(); | 
|  |  | 
|  | public: | 
|  | explicit NoGCScope(HeapBase& heap); | 
|  | ~NoGCScope(); | 
|  |  | 
|  | NoGCScope(const NoGCScope&) = delete; | 
|  | NoGCScope& operator=(const NoGCScope&) = delete; | 
|  |  | 
|  | private: | 
|  | HeapBase& heap_; | 
|  | }; | 
|  |  | 
|  | HeapBase(std::shared_ptr<cppgc::Platform> platform, | 
|  | const std::vector<std::unique_ptr<CustomSpaceBase>>& custom_spaces, | 
|  | StackSupport stack_support); | 
|  | virtual ~HeapBase(); | 
|  |  | 
|  | HeapBase(const HeapBase&) = delete; | 
|  | HeapBase& operator=(const HeapBase&) = delete; | 
|  |  | 
|  | RawHeap& raw_heap() { return raw_heap_; } | 
|  | const RawHeap& raw_heap() const { return raw_heap_; } | 
|  |  | 
|  | cppgc::Platform* platform() { return platform_.get(); } | 
|  | const cppgc::Platform* platform() const { return platform_.get(); } | 
|  |  | 
|  | PageBackend* page_backend() { return page_backend_.get(); } | 
|  | const PageBackend* page_backend() const { return page_backend_.get(); } | 
|  |  | 
|  | StatsCollector* stats_collector() { return stats_collector_.get(); } | 
|  | const StatsCollector* stats_collector() const { | 
|  | return stats_collector_.get(); | 
|  | } | 
|  |  | 
|  | #if defined(CPPGC_CAGED_HEAP) | 
|  | CagedHeap& caged_heap() { return caged_heap_; } | 
|  | const CagedHeap& caged_heap() const { return caged_heap_; } | 
|  | #endif | 
|  |  | 
|  | heap::base::Stack* stack() { return stack_.get(); } | 
|  |  | 
|  | PreFinalizerHandler* prefinalizer_handler() { | 
|  | return prefinalizer_handler_.get(); | 
|  | } | 
|  |  | 
|  | MarkerBase* marker() const { return marker_.get(); } | 
|  |  | 
|  | Compactor& compactor() { return compactor_; } | 
|  |  | 
|  | ObjectAllocator& object_allocator() { return object_allocator_; } | 
|  |  | 
|  | Sweeper& sweeper() { return sweeper_; } | 
|  |  | 
|  | PersistentRegion& GetStrongPersistentRegion() { | 
|  | return strong_persistent_region_; | 
|  | } | 
|  | const PersistentRegion& GetStrongPersistentRegion() const { | 
|  | return strong_persistent_region_; | 
|  | } | 
|  | PersistentRegion& GetWeakPersistentRegion() { | 
|  | return weak_persistent_region_; | 
|  | } | 
|  | const PersistentRegion& GetWeakPersistentRegion() const { | 
|  | return weak_persistent_region_; | 
|  | } | 
|  | PersistentRegion& GetStrongCrossThreadPersistentRegion() { | 
|  | return strong_cross_thread_persistent_region_; | 
|  | } | 
|  | const PersistentRegion& GetStrongCrossThreadPersistentRegion() const { | 
|  | return strong_cross_thread_persistent_region_; | 
|  | } | 
|  | PersistentRegion& GetWeakCrossThreadPersistentRegion() { | 
|  | return weak_cross_thread_persistent_region_; | 
|  | } | 
|  | const PersistentRegion& GetWeakCrossThreadPersistentRegion() const { | 
|  | return weak_cross_thread_persistent_region_; | 
|  | } | 
|  |  | 
|  | #if defined(CPPGC_YOUNG_GENERATION) | 
|  | std::set<void*>& remembered_slots() { return remembered_slots_; } | 
|  | #endif | 
|  |  | 
|  | size_t ObjectPayloadSize() const; | 
|  |  | 
|  | StackSupport stack_support() const { return stack_support_; } | 
|  |  | 
|  | void AdvanceIncrementalGarbageCollectionOnAllocationIfNeeded(); | 
|  |  | 
|  | protected: | 
|  | virtual void FinalizeIncrementalGarbageCollectionIfNeeded( | 
|  | cppgc::Heap::StackState) = 0; | 
|  |  | 
|  | bool in_no_gc_scope() const { return no_gc_scope_ > 0; } | 
|  |  | 
|  | RawHeap raw_heap_; | 
|  | std::shared_ptr<cppgc::Platform> platform_; | 
|  | #if defined(CPPGC_CAGED_HEAP) | 
|  | CagedHeap caged_heap_; | 
|  | #endif | 
|  | std::unique_ptr<PageBackend> page_backend_; | 
|  |  | 
|  | std::unique_ptr<StatsCollector> stats_collector_; | 
|  | std::unique_ptr<heap::base::Stack> stack_; | 
|  | std::unique_ptr<PreFinalizerHandler> prefinalizer_handler_; | 
|  | std::unique_ptr<MarkerBase> marker_; | 
|  |  | 
|  | Compactor compactor_; | 
|  | ObjectAllocator object_allocator_; | 
|  | Sweeper sweeper_; | 
|  |  | 
|  | PersistentRegion strong_persistent_region_; | 
|  | PersistentRegion weak_persistent_region_; | 
|  | PersistentRegion strong_cross_thread_persistent_region_; | 
|  | PersistentRegion weak_cross_thread_persistent_region_; | 
|  |  | 
|  | #if defined(CPPGC_YOUNG_GENERATION) | 
|  | std::set<void*> remembered_slots_; | 
|  | #endif | 
|  |  | 
|  | size_t no_gc_scope_ = 0; | 
|  |  | 
|  | const StackSupport stack_support_; | 
|  |  | 
|  | friend class MarkerBase::IncrementalMarkingTask; | 
|  | friend class testing::TestWithHeap; | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace cppgc | 
|  |  | 
|  | #endif  // V8_HEAP_CPPGC_HEAP_BASE_H_ |