Memory resource implementing the first fit, top-down allocation policies, using a dynamically allocated arena. More...
#include <cmsis-plus/memory/first-fit-top.h>
Public Types | |
using | allocator_traits = std::allocator_traits< A > |
Standard allocator traits definition. | |
using | allocator_type = A |
Standard allocator type definition. | |
using | value_type = char |
Standard allocator type definition. | |
Public Member Functions | |
Constructors & Destructor | |
first_fit_top_allocated (std::size_t bytes, const allocator_type &allocator=allocator_type()) | |
Construct a memory resource object instance. | |
first_fit_top_allocated (const char *name, std::size_t bytes, const allocator_type &allocator=allocator_type()) | |
Construct a named memory resource object instance. | |
virtual | ~first_fit_top_allocated () |
Destruct the memory resource object instance. | |
Public Member Functions | |
void * | allocate (std::size_t bytes, std::size_t alignment=max_align) |
Allocate a memory block. | |
void | deallocate (void *addr, std::size_t bytes, std::size_t alignment=max_align) noexcept |
Deallocate the previously allocated memory block. | |
bool | is_equal (memory_resource const &other) const noexcept |
Compare for equality with another memory_resource . | |
void | reset (void) noexcept |
Reset the memory manager to the initial state. | |
bool | coalesce (void) noexcept |
Coalesce free blocks. | |
std::size_t | max_size (void) const noexcept |
Get the largest value that can be passed to allocate() . | |
out_of_memory_handler_t | out_of_memory_handler (out_of_memory_handler_t handler) |
Set the out of memory handler. | |
out_of_memory_handler_t | out_of_memory_handler (void) |
Get the out of memory handler. | |
std::size_t | total_bytes (void) |
Get the total size of managed memory. | |
std::size_t | allocated_bytes (void) |
Get the current size of all allocated chunks. | |
std::size_t | max_allocated_bytes (void) |
Get the maximum allocated size. | |
std::size_t | free_bytes (void) |
Get the current size of all free chunks. | |
std::size_t | allocated_chunks (void) |
Get the current number of allocated chunks. | |
std::size_t | free_chunks (void) |
Get the current number of free chunks. | |
std::size_t | allocations (void) |
Get the number of allocations. | |
std::size_t | deallocations (void) |
Get the number of deallocations. | |
void | trace_print_statistics (void) |
Print a long message with usage statistics. | |
Public Member Functions | |
const char * | name (void) const |
Get object name. | |
Static Public Attributes | |
static constexpr std::size_t | max_align = alignof(std::max_align_t) |
The largest alignment for the platform. Also default when supplied alignment is not supported. | |
Protected Member Functions | |
Private Member Functions | |
void | internal_construct_ (void *addr, std::size_t bytes) |
Internal function to construct the memory resource. | |
void | internal_reset_ (void) noexcept |
Internal function to reset the memory resource. | |
void * | internal_align_ (chunk_t *chunk, std::size_t bytes, std::size_t alignment) |
Internal function to align a chunk. | |
virtual void * | do_allocate (std::size_t bytes, std::size_t alignment) override |
Implementation of the memory allocator. | |
virtual void | do_deallocate (void *addr, std::size_t bytes, std::size_t alignment) noexcept override |
Implementation of the memory deallocator. | |
virtual std::size_t | do_max_size (void) const noexcept override |
Implementation of the function to get max size. | |
virtual void | do_reset (void) noexcept override |
Implementation of the function to reset the memory manager. | |
Private Member Functions | |
virtual bool | do_is_equal (memory_resource const &other) const noexcept |
Implementation of the equality comparator. | |
virtual bool | do_coalesce (void) noexcept |
Implementation of the function to coalesce free blocks. | |
void | internal_increase_allocated_statistics (std::size_t bytes) noexcept |
Update statistics after allocation. | |
void | internal_decrease_allocated_statistics (std::size_t bytes) noexcept |
Update statistics after deallocation. | |
Memory resource implementing the first fit, top-down allocation policies, using a dynamically allocated arena.
This class template is a convenience class that allocates an array of chars to be used as the allocation arena.
The common use case it to define dynamically allocated memory managers.
Definition at line 385 of file first-fit-top.h.
using os::memory::first_fit_top_allocated< A >::allocator_traits = std::allocator_traits<A> |
Standard allocator traits definition.
Definition at line 402 of file first-fit-top.h.
using os::memory::first_fit_top_allocated< A >::allocator_type = A |
Standard allocator type definition.
Definition at line 397 of file first-fit-top.h.
using os::memory::first_fit_top_allocated< A >::value_type = char |
Standard allocator type definition.
Definition at line 392 of file first-fit-top.h.
|
inline |
Construct a memory resource object instance.
[in] | bytes | The size of the allocation arena. |
[in] | allocator | Reference to allocator. Default a local temporary instance. |
Definition at line 557 of file first-fit-top.h.
os::memory::first_fit_top_allocated< A >::first_fit_top_allocated | ( | const char * | name, |
std::size_t | bytes, | ||
const allocator_type & | allocator = allocator_type () |
||
) |
Construct a named memory resource object instance.
[in] | name | Pointer to name. |
[in] | bytes | The size of the allocation arena. |
[in] | allocator | Reference to allocator. Default a local temporary instance. |
Definition at line 565 of file first-fit-top.h.
|
virtual |
Destruct the memory resource object instance.
Definition at line 586 of file first-fit-top.h.
|
inlineinherited |
Allocate a memory block.
bytes | Number of bytes to allocate. |
alignment | Alignment constraint (power of 2). |
nullptr
.Allocate storage with a size of at least bytes bytes. The returned storage is aligned to the specified alignment if such alignment is supported, and to alignof(std::max_align_t)
otherwise.
If the storage of the requested size and alignment cannot be obtained:
nullptr
;Equivalent to return do_allocate(bytes, alignment);
.
bad_alloc()
exception.Definition at line 1294 of file os-memory.h.
|
inlineinherited |
Get the current size of all allocated chunks.
Definition at line 1406 of file os-memory.h.
|
inlineinherited |
Get the current number of allocated chunks.
Definition at line 1424 of file os-memory.h.
|
inlineinherited |
Get the number of allocations.
Definition at line 1436 of file os-memory.h.
|
inlinenoexceptinherited |
Coalesce free blocks.
true | if the operation freed more memory. |
false | if the operation was ineffective. |
In case the memory manager does not coalesce during deallocation, traverse the list of free blocks and coalesce.
Return true
if the operation was successful and at least one larger block resulted.
Definition at line 1369 of file os-memory.h.
|
inlinenoexceptinherited |
Deallocate the previously allocated memory block.
addr | Address of the block to free. |
bytes | Number of bytes to deallocate (may be 0 if unknown). |
alignment | Alignment constraint (power of 2). |
Deallocate the storage pointed to by addr. The address shall have been returned by a prior call to allocate()
on a memory_resource that compares equal to *this
, and the storage it points to shall not yet have been deallocated.
Equivalent to return do_deallocate(p, bytes, alignment);
.
Definition at line 1316 of file os-memory.h.
|
inlineinherited |
Get the number of deallocations.
Definition at line 1442 of file os-memory.h.
|
overrideprotectedvirtualinherited |
Implementation of the memory allocator.
[in] | bytes | Number of bytes to allocate. |
[in] | alignment | Alignment constraint (power of 2). |
nullptr
.The allocator tries to be fast and grasps the first block large enough, possibly splitting large blocks and increasing fragmentation. If the block is only slightly larger (the remaining space is not large enough for a minimum chunk) the block is not split, but left partly unused.
When large blocks are split, the top sub-block is returned; in other words, memory is allocated top-down. This speeds up deallocation for blocks allocated recently.
bad_alloc()
. Implements os::rtos::memory::memory_resource.
Reimplemented in os::memory::lifo.
Definition at line 124 of file first-fit-top.cpp.
|
protectedvirtualnoexceptinherited |
Implementation of the function to coalesce free blocks.
true | if the operation resulted in larger blocks. |
false | if the operation was ineffective. |
The default implementation of this virtual function returns false, meaning the operation was ineffective.
Override this function to perform the action.
Definition at line 471 of file os-memory.cpp.
|
overrideprotectedvirtualnoexceptinherited |
Implementation of the memory deallocator.
[in] | addr | Address of a previously allocated block to free. |
[in] | bytes | Number of bytes to deallocate (may be 0 if unknown). |
[in] | alignment | Alignment constraint (power of 2). |
Deallocation is not guaranteed to be deterministic, but if done in strict reverse allocation order, it becomes deterministic, otherwise a traversal of the free list is required, the older the block, the more nodes to traverse (the free list is kept in ascending addresses order).
If the block is already in the free list, issue a trace message, but otherwise ignore the condition.
Implements os::rtos::memory::memory_resource.
Definition at line 236 of file first-fit-top.cpp.
|
protectedvirtualnoexceptinherited |
Implementation of the equality comparator.
other | Reference to another memory_resource . |
true | The memory_resource objects are equal. |
false | The memory_resource objects are not equal. |
Compares *this
for equality with other
. Two memory_resources compare equal if and only if memory allocated from one memory_resource can be deallocated from the other and vice versa.
The most-derived type of other may not match the most derived type of *this
. A derived class implementation therefore must typically check whether the most derived types of *this
and other match using dynamic_cast, and immediately return false if the cast fails.
Definition at line 423 of file os-memory.cpp.
|
overrideprotectedvirtualnoexceptinherited |
Implementation of the function to get max size.
Reimplemented from os::rtos::memory::memory_resource.
Definition at line 393 of file first-fit-top.cpp.
|
overrideprotectedvirtualnoexceptinherited |
Implementation of the function to reset the memory manager.
Reimplemented from os::rtos::memory::memory_resource.
Definition at line 94 of file first-fit-top.cpp.
|
inlineinherited |
Get the current size of all free chunks.
Definition at line 1418 of file os-memory.h.
|
inlineinherited |
Get the current number of free chunks.
Definition at line 1430 of file os-memory.h.
|
protectedinherited |
Internal function to align a chunk.
[in] | chunk | Pointer to chunk. |
[in] | bytes | Bytes to allocate. |
[in] | alignment | Power of two. |
Definition at line 399 of file first-fit-top.cpp.
|
protectedinherited |
Internal function to construct the memory resource.
[in] | addr | Begin of allocator arena. |
[in] | bytes | Size of allocator arena, in bytes. |
Definition at line 52 of file first-fit-top.cpp.
|
protectednoexceptinherited |
Update statistics after deallocation.
[in] | bytes | Number of deallocated bytes. |
Definition at line 493 of file os-memory.cpp.
|
protectednoexceptinherited |
Update statistics after allocation.
[in] | bytes | Number of allocated bytes. |
Definition at line 477 of file os-memory.cpp.
|
protectednoexceptinherited |
Internal function to reset the memory resource.
Definition at line 74 of file first-fit-top.cpp.
|
inlinenoexceptinherited |
Compare for equality with another memory_resource
.
other | Reference to another memory_resource . |
true | The memory_resource objects are equal. |
false | The memory_resource objects are not equal. |
Compare *this
for equality with other. Two memory_resources
compare equal if and only if memory allocated from one memory_resource
can be deallocated from the other and vice versa.
Definition at line 1335 of file os-memory.h.
|
inlineinherited |
Get the maximum allocated size.
Definition at line 1412 of file os-memory.h.
|
inlinenoexceptinherited |
Get the largest value that can be passed to allocate()
.
Definition at line 1344 of file os-memory.h.
|
inlineinherited |
Get object name.
All objects return a non-null string; anonymous objects return "-"
.
Definition at line 774 of file os-decls.h.
|
inlineinherited |
Set the out of memory handler.
handler | Pointer to new handler. |
Definition at line 1379 of file os-memory.h.
|
inlineinherited |
Get the out of memory handler.
Definition at line 1394 of file os-memory.h.
|
inlinenoexceptinherited |
Reset the memory manager to the initial state.
Definition at line 1353 of file os-memory.h.
|
inlineinherited |
Get the total size of managed memory.
Definition at line 1400 of file os-memory.h.
|
inlineinherited |
Print a long message with usage statistics.
Definition at line 1448 of file os-memory.h.
|
staticconstexprinherited |
The largest alignment for the platform. Also default when supplied alignment is not supported.
Definition at line 173 of file os-memory.h.