12#if defined(OS_USE_OS_APP_CONFIG_H)
13#include <cmsis-plus/os-app-config.h>
22#pragma clang diagnostic ignored "-Wc++98-compat"
39#pragma GCC diagnostic push
41#pragma GCC diagnostic ignored "-Wunused-parameter"
70 std::size_t block_padding = calc_block_padding (alignment);
72 alloc_size += block_padding;
73 alloc_size += chunk_offset;
75 std::size_t block_minchunk = calc_block_minchunk (block_padding);
78 chunk_t* chunk =
nullptr;
84 if (free_list_ ==
reinterpret_cast<chunk_t*
> (arena_addr_))
88 int rem =
static_cast<int> (chunk->size - alloc_size);
91 if ((
static_cast<std::size_t
> (rem)) >= block_minchunk)
98 chunk->size =
static_cast<std::size_t
> (rem);
100#pragma GCC diagnostic push
101#pragma GCC diagnostic ignored "-Wcast-align"
102#if defined(__clang__)
103#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
106 chunk =
reinterpret_cast<chunk_t*
> (
107 reinterpret_cast<char*
> (chunk) + rem);
108#pragma GCC diagnostic pop
109 chunk->size = alloc_size;
121 free_list_ = chunk->next;
128 if (chunk !=
nullptr)
133 if (out_of_memory_handler_ ==
nullptr)
135#if defined(OS_TRACE_LIBCPP_MEMORY_RESOURCE)
136 trace::printf (
"lifo::%s(%u,%u)=0 @%p %s\n", __func__, bytes,
137 alignment,
this, this->
name ());
143#if defined(OS_TRACE_LIBCPP_MEMORY_RESOURCE)
144 trace::printf (
"lifo::%s(%u,%u) @%p %s out of memory\n", __func__,
145 bytes, alignment,
this, this->
name ());
147 out_of_memory_handler_ ();
155#if defined(OS_TRACE_LIBCPP_MEMORY_RESOURCE)
156 trace::printf (
"lifo::%s(%u,%u)=%p,%u @%p %s\n", __func__, bytes,
157 alignment, aligned_payload, alloc_size,
this,
name ());
160 return aligned_payload;
163#pragma GCC diagnostic pop
void * internal_align_(chunk_t *chunk, std::size_t bytes, std::size_t alignment)
Internal function to align a chunk.
virtual ~lifo() override
Destruct the memory resource object instance.
virtual void * do_allocate(std::size_t bytes, std::size_t alignment) override
Implementation of the memory allocator.
const char * name(void) const
Get object name.
int printf(const char *format,...)
Write a formatted string to the trace device.
constexpr std::size_t align_size(std::size_t size, std::size_t align) noexcept
Helper function to align size values.
constexpr std::size_t max(std::size_t a, std::size_t b)