31#ifndef ETL_REFERENCE_COUNTED_MESSAGE_POOL_INCLUDED
32#define ETL_REFERENCE_COUNTED_MESSAGE_POOL_INCLUDED
38#include "reference_counted_message.h"
39#include "static_assert.h"
55 reference_counted_message_pool_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
56 :
exception(reason_, file_name_, line_number_)
68 reference_counted_message_pool_allocation_failure(string_type file_name_, numeric_type line_number_)
69 : reference_counted_message_pool_exception(ETL_ERROR_TEXT(
"reference_counted_message_pool:allocation failure", ETL_REFERENCE_COUNTER_MESSAGE_POOL_FILE_ID
"A"), file_name_, line_number_)
81 reference_counted_message_pool_release_failure(string_type file_name_, numeric_type line_number_)
82 : reference_counted_message_pool_exception(ETL_ERROR_TEXT(
"reference_counted_message_pool:release failure", ETL_REFERENCE_COUNTER_MESSAGE_POOL_FILE_ID
"B"), file_name_, line_number_)
90 template <
typename TCounter>
99 : memory_block_allocator(memory_block_allocator_)
107 template <
typename TMessage,
typename... TArgs>
113 typedef rcm_t* prcm_t;
115 prcm_t p = ETL_NULLPTR;
121 if (p != ETL_NULLPTR)
123 ::new(p) rcm_t(*
this, etl::forward<TArgs>(args)...);
135 template <
typename TMessage>
141 typedef rcm_t* prcm_t;
143 prcm_t p = ETL_NULLPTR;
149 if (p != ETL_NULLPTR)
151 ::new(p) rcm_t(
message, *
this);
162 template <
typename TMessage>
168 typedef rcm_t* prcm_t;
170 prcm_t p = ETL_NULLPTR;
176 if (p != ETL_NULLPTR)
178 ::new(p) rcm_t(*
this);
191 bool released =
false;
194 if (memory_block_allocator.is_owner_of(&rcmessage))
196 rcmessage.~ireference_counted_message();
197 released = memory_block_allocator.release(&rcmessage);
206 template <
typename TMessage1,
typename... TMessages>
207 struct pool_message_parameters
215 static constexpr size_t size2 = pool_message_parameters<TMessages...>::max_size;
221 static constexpr size_t alignment2 = pool_message_parameters<TMessages...>::max_alignment;
226 static constexpr size_t max_size = (size1 < size2) ? size2 : size1;
229 static constexpr size_t max_alignment = (alignment1 < alignment2) ? alignment2 : alignment1;
233 template <
typename TMessage1>
234 struct pool_message_parameters<TMessage1>
248 template <
typename TMessage1,
typename TMessage2 = TMessage1,
typename TMessage3 = TMessage1,
typename TMessage4 = TMessage1,
249 typename TMessage5 = TMessage1,
typename TMessage6 = TMessage1,
typename TMessage7 = TMessage1,
typename TMessage8 = TMessage1>
295 template <
typename TCounter>
296 template <
typename TMessage1,
typename... TMessages>
299 template <
typename TCounter>
300 template <
typename TMessage1,
typename... TMessages>
305 template <
typename TCounter>
306 template <
typename TMessage1,
typename TMessage2,
typename TMessage3,
typename TMessage4,
307 typename TMessage5,
typename TMessage6,
typename TMessage7,
typename TMessage8>
310 template <
typename TCounter>
311 template <
typename TMessage1,
typename TMessage2,
typename TMessage3,
typename TMessage4,
312 typename TMessage5,
typename TMessage6,
typename TMessage7,
typename TMessage8>
317#if ETL_USING_CPP11 && ETL_HAS_ATOMIC
The interface for a memory block pool.
Definition imemory_block_allocator.h:44
void * allocate(size_t required_size, size_t required_alignment)
Definition imemory_block_allocator.h:58
Interface for a reference counted message pool.
Definition ireference_counted_message_pool.h:44
virtual void unlock()
Definition ireference_counted_message_pool.h:65
virtual void lock()
Definition ireference_counted_message_pool.h:56
Definition reference_counted_message.h:48
Exception if the allocation failed.
Definition reference_counted_message_pool.h:65
Exception type for etl::reference_counted_message_pool.
Definition reference_counted_message_pool.h:52
Exception if the release failed.
Definition reference_counted_message_pool.h:78
A pool for allocating reference counted messages.
Definition reference_counted_message_pool.h:92
void release(const etl::ireference_counted_message &rcmessage)
Destruct a message and send it back to the allocator.
Definition reference_counted_message_pool.h:189
reference_counted_message_pool(etl::imemory_block_allocator &memory_block_allocator_)
Constructor.
Definition reference_counted_message_pool.h:98
etl::reference_counted_message< TMessage, TCounter > * allocate(const TMessage &message)
Allocate a reference counted message from the pool.
Definition reference_counted_message_pool.h:136
etl::reference_counted_message< TMessage, TCounter > * allocate()
Allocate a reference counted message from the pool.
Definition reference_counted_message_pool.h:163
Definition reference_counted_message.h:64
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
Definition exception.h:47
add_rvalue_reference
Definition type_traits_generator.h:1413
is_base_of
Definition type_traits_generator.h:1315
bitset_ext
Definition absolute.h:39
size_t max_size() const
Returns the maximum number of items in the variant_pool.
Definition variant_pool_generator.h:395
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1187
Definition reference_counted_message_pool.h:251