Skip to content

Commit

Permalink
Modify arena custom interface for detachment.
Browse files Browse the repository at this point in the history
  • Loading branch information
evoskuil committed Aug 18, 2024
1 parent f47d84a commit d9f38d8
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 7 deletions.
20 changes: 16 additions & 4 deletions include/bitcoin/system/arena.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,19 @@ class arena
return do_is_equal(other);
}

/// Non-linear allocator is a nop and returns nullptr.
/// Reset linear allocator and return starting address (not pmr interface).
virtual void* initialize() NOEXCEPT = 0;
/// Non-linear allocator just returns next address.
/// Linear allocator resets to and returns buffer first address.
/// Detachable linear allocator allocates buffer returns its first address.
virtual void* start() NOEXCEPT = 0;

/// Non-linear allocator just returns zero.
/// Linear allocator returns current allocation size.
/// Detachable linear allocator detaches allocation and returns its size.
virtual size_t detach() NOEXCEPT = 0;

/// Non-linear and linear allocator is a nop.
/// Detachable linear allocator frees the memory associated with ptr.
virtual void release(void* ptr, size_t bytes) NOEXCEPT = 0;

private:
virtual void* do_allocate(size_t bytes, size_t align) THROWS = 0;
Expand Down Expand Up @@ -83,7 +93,9 @@ class BC_API default_arena final
{
public:
static arena* get() NOEXCEPT;
void* initialize() NOEXCEPT override;
void* start() NOEXCEPT override;
size_t detach() NOEXCEPT override;
void release(void* ptr, size_t bytes) NOEXCEPT override;

private:
void* do_allocate(size_t bytes, size_t align) THROWS override;
Expand Down
11 changes: 10 additions & 1 deletion src/arena.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,20 @@ bool default_arena::do_is_equal(const arena& other) const NOEXCEPT
return &other == this;
}

void* default_arena::initialize() NOEXCEPT
void* default_arena::start() NOEXCEPT
{
return nullptr;
}

size_t default_arena::detach() NOEXCEPT
{
return zero;
}

void default_arena::release(void*, size_t) NOEXCEPT
{
}

BC_POP_WARNING()

} // namespace libbitcoin
22 changes: 20 additions & 2 deletions test/test.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,20 @@ class reporting_arena
size_t dec_count{};
size_t dec_bytes{};

void* initialize() NOEXCEPT override
void* start() NOEXCEPT override
{
return nullptr;
}

size_t detach() NOEXCEPT override
{
return zero;
}

void release(void*, size_t) NOEXCEPT override
{
}

private:
void* do_allocate(size_t bytes, size_t align) override
{
Expand Down Expand Up @@ -189,11 +198,20 @@ class mock_arena
size_t do_deallocate_align{};
mutable const arena* do_is_equal_address{};

void* initialize() NOEXCEPT override
void* start() NOEXCEPT override
{
return nullptr;
}

size_t detach() NOEXCEPT override
{
return zero;
}

void release(void*, size_t) NOEXCEPT override
{
}

private:
void* do_allocate(size_t bytes, size_t align) THROWS override
{
Expand Down

0 comments on commit d9f38d8

Please sign in to comment.