| // 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 INCLUDE_CPPGC_HEAP_H_ |
| #define INCLUDE_CPPGC_HEAP_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "cppgc/common.h" |
| #include "cppgc/custom-space.h" |
| #include "cppgc/platform.h" |
| #include "v8config.h" // NOLINT(build/include_directory) |
| |
| /** |
| * cppgc - A C++ garbage collection library. |
| */ |
| namespace cppgc { |
| |
| class AllocationHandle; |
| |
| /** |
| * Implementation details of cppgc. Those details are considered internal and |
| * may change at any point in time without notice. Users should never rely on |
| * the contents of this namespace. |
| */ |
| namespace internal { |
| class Heap; |
| } // namespace internal |
| |
| class V8_EXPORT Heap { |
| public: |
| /** |
| * Specifies the stack state the embedder is in. |
| */ |
| using StackState = EmbedderStackState; |
| |
| /** |
| * Specifies whether conservative stack scanning is supported. |
| */ |
| enum class StackSupport : uint8_t { |
| /** |
| * Conservative stack scan is supported. |
| */ |
| kSupportsConservativeStackScan, |
| /** |
| * Conservative stack scan is not supported. Embedders may use this option |
| * when using custom infrastructure that is unsupported by the library. |
| */ |
| kNoConservativeStackScan, |
| }; |
| |
| /** |
| * Constraints for a Heap setup. |
| */ |
| struct ResourceConstraints { |
| /** |
| * Allows the heap to grow to some initial size in bytes before triggering |
| * garbage collections. This is useful when it is known that applications |
| * need a certain minimum heap to run to avoid repeatedly invoking the |
| * garbage collector when growing the heap. |
| */ |
| size_t initial_heap_size_bytes = 0; |
| }; |
| |
| /** |
| * Options specifying Heap properties (e.g. custom spaces) when initializing a |
| * heap through `Heap::Create()`. |
| */ |
| struct HeapOptions { |
| /** |
| * Creates reasonable defaults for instantiating a Heap. |
| * |
| * \returns the HeapOptions that can be passed to `Heap::Create()`. |
| */ |
| static HeapOptions Default() { return {}; } |
| |
| /** |
| * Custom spaces added to heap are required to have indices forming a |
| * numbered sequence starting at 0, i.e., their `kSpaceIndex` must |
| * correspond to the index they reside in the vector. |
| */ |
| std::vector<std::unique_ptr<CustomSpaceBase>> custom_spaces; |
| |
| /** |
| * Specifies whether conservative stack scan is supported. When conservative |
| * stack scan is not supported, the collector may try to invoke |
| * garbage collections using non-nestable task, which are guaranteed to have |
| * no interesting stack, through the provided Platform. If such tasks are |
| * not supported by the Platform, the embedder must take care of invoking |
| * the GC through `ForceGarbageCollectionSlow()`. |
| */ |
| StackSupport stack_support = StackSupport::kSupportsConservativeStackScan; |
| |
| /** |
| * Resource constraints specifying various properties that the internal |
| * GC scheduler follows. |
| */ |
| ResourceConstraints resource_constraints; |
| }; |
| |
| /** |
| * Creates a new heap that can be used for object allocation. |
| * |
| * \param platform implemented and provided by the embedder. |
| * \param options HeapOptions specifying various properties for the Heap. |
| * \returns a new Heap instance. |
| */ |
| static std::unique_ptr<Heap> Create( |
| std::shared_ptr<Platform> platform, |
| HeapOptions options = HeapOptions::Default()); |
| |
| virtual ~Heap() = default; |
| |
| /** |
| * Forces garbage collection. |
| * |
| * \param source String specifying the source (or caller) triggering a |
| * forced garbage collection. |
| * \param reason String specifying the reason for the forced garbage |
| * collection. |
| * \param stack_state The embedder stack state, see StackState. |
| */ |
| void ForceGarbageCollectionSlow( |
| const char* source, const char* reason, |
| StackState stack_state = StackState::kMayContainHeapPointers); |
| |
| /** |
| * \returns the opaque handle for allocating objects using |
| * `MakeGarbageCollected()`. |
| */ |
| AllocationHandle& GetAllocationHandle(); |
| |
| private: |
| Heap() = default; |
| |
| friend class internal::Heap; |
| }; |
| |
| } // namespace cppgc |
| |
| #endif // INCLUDE_CPPGC_HEAP_H_ |