| 1 | //===----------------------------------------------------------------------===// |
|---|---|
| 2 | // DuckDB |
| 3 | // |
| 4 | // duckdb/storage/arena_allocator.hpp |
| 5 | // |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #pragma once |
| 10 | |
| 11 | #include "duckdb/common/allocator.hpp" |
| 12 | #include "duckdb/common/common.hpp" |
| 13 | |
| 14 | namespace duckdb { |
| 15 | |
| 16 | struct ArenaChunk { |
| 17 | ArenaChunk(Allocator &allocator, idx_t size); |
| 18 | ~ArenaChunk(); |
| 19 | |
| 20 | AllocatedData data; |
| 21 | idx_t current_position; |
| 22 | idx_t maximum_size; |
| 23 | unsafe_unique_ptr<ArenaChunk> next; |
| 24 | ArenaChunk *prev; |
| 25 | }; |
| 26 | |
| 27 | class ArenaAllocator { |
| 28 | static constexpr const idx_t ARENA_ALLOCATOR_INITIAL_CAPACITY = 2048; |
| 29 | |
| 30 | public: |
| 31 | DUCKDB_API ArenaAllocator(Allocator &allocator, idx_t initial_capacity = ARENA_ALLOCATOR_INITIAL_CAPACITY); |
| 32 | DUCKDB_API ~ArenaAllocator(); |
| 33 | |
| 34 | DUCKDB_API data_ptr_t Allocate(idx_t size); |
| 35 | DUCKDB_API data_ptr_t Reallocate(data_ptr_t pointer, idx_t old_size, idx_t size); |
| 36 | |
| 37 | DUCKDB_API data_ptr_t AllocateAligned(idx_t size); |
| 38 | DUCKDB_API data_ptr_t ReallocateAligned(data_ptr_t pointer, idx_t old_size, idx_t size); |
| 39 | |
| 40 | //! Resets the current head and destroys all previous arena chunks |
| 41 | DUCKDB_API void Reset(); |
| 42 | DUCKDB_API void Destroy(); |
| 43 | DUCKDB_API void Move(ArenaAllocator &allocator); |
| 44 | |
| 45 | DUCKDB_API ArenaChunk *GetHead(); |
| 46 | DUCKDB_API ArenaChunk *GetTail(); |
| 47 | |
| 48 | DUCKDB_API bool IsEmpty(); |
| 49 | |
| 50 | //! Returns an "Allocator" wrapper for this arena allocator |
| 51 | Allocator &GetAllocator() { |
| 52 | return arena_allocator; |
| 53 | } |
| 54 | |
| 55 | private: |
| 56 | //! Internal allocator that is used by the arena allocator |
| 57 | Allocator &allocator; |
| 58 | idx_t current_capacity; |
| 59 | unsafe_unique_ptr<ArenaChunk> head; |
| 60 | ArenaChunk *tail; |
| 61 | //! An allocator wrapper using this arena allocator |
| 62 | Allocator arena_allocator; |
| 63 | }; |
| 64 | |
| 65 | } // namespace duckdb |
| 66 |