31#ifndef ETL_REFERENCE_COUNTED_MESSAGE_POOL_INCLUDED
32#define ETL_REFERENCE_COUNTED_MESSAGE_POOL_INCLUDED
42#include "reference_counted_message.h"
43#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(
70 ETL_ERROR_TEXT(
"reference_counted_message_pool:allocation failure", ETL_REFERENCE_COUNTER_MESSAGE_POOL_FILE_ID
"A"), file_name_, line_number_)
82 reference_counted_message_pool_release_failure(string_type file_name_, numeric_type line_number_)
83 : reference_counted_message_pool_exception(
84 ETL_ERROR_TEXT(
"reference_counted_message_pool:release failure", ETL_REFERENCE_COUNTER_MESSAGE_POOL_FILE_ID
"B"), file_name_, line_number_)
92 template <
typename TCounter>
101 : memory_block_allocator(memory_block_allocator_)
109 template <
typename TMessage,
typename... TArgs>
112 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage>::value),
"Not a message type");
115 typedef rcm_t* prcm_t;
117 prcm_t p = ETL_NULLPTR;
120 p =
static_cast<prcm_t
>(memory_block_allocator.
allocate(
sizeof(rcm_t), etl::alignment_of<rcm_t>::value));
123 if (p != ETL_NULLPTR)
125 ::new (p) rcm_t(*
this, etl::forward<TArgs>(args)...);
137 template <
typename TMessage>
140 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage>::value),
"Not a message type");
143 typedef rcm_t* prcm_t;
145 prcm_t p = ETL_NULLPTR;
148 p =
static_cast<prcm_t
>(memory_block_allocator.allocate(
sizeof(rcm_t), etl::alignment_of<rcm_t>::value));
151 if (p != ETL_NULLPTR)
153 ::new (p) rcm_t(
message, *
this);
164 template <
typename TMessage>
167 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage>::value),
"Not a message type");
170 typedef rcm_t* prcm_t;
172 prcm_t p = ETL_NULLPTR;
175 p =
static_cast<prcm_t
>(memory_block_allocator.allocate(
sizeof(rcm_t), etl::alignment_of<rcm_t>::value));
178 if (p != ETL_NULLPTR)
180 ::new (p) rcm_t(*
this);
193 bool released =
false;
196 if (memory_block_allocator.is_owner_of(&rcmessage))
198 rcmessage.~ireference_counted_message();
199 released = memory_block_allocator.release(&rcmessage);
208 template <
typename TMessage1,
typename... TMessages>
209 struct pool_message_parameters
217 static constexpr size_t size2 = pool_message_parameters<TMessages...>::max_size;
220 static constexpr size_t alignment1 = etl::alignment_of< etl::reference_counted_message<TMessage1, TCounter>>::value;
223 static constexpr size_t alignment2 = pool_message_parameters<TMessages...>::max_alignment;
228 static constexpr size_t max_size = (size1 < size2) ? size2 : size1;
231 static constexpr size_t max_alignment = (alignment1 < alignment2) ? alignment2 : alignment1;
235 template <
typename TMessage1>
236 struct pool_message_parameters<TMessage1>
240 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage not derived from etl::imessage");
246 static constexpr size_t max_alignment = etl::alignment_of< etl::reference_counted_message<TMessage1, TCounter>>::value;
250 template <
typename TMessage1,
typename TMessage2 = TMessage1,
typename TMessage3 = TMessage1,
typename TMessage4 = TMessage1,
251 typename TMessage5 = TMessage1,
typename TMessage6 = TMessage1,
typename TMessage7 = TMessage1,
typename TMessage8 = TMessage1>
254 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage1 not derived from etl::imessage");
255 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage2 not derived from etl::imessage");
256 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage3 not derived from etl::imessage");
257 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage4 not derived from etl::imessage");
258 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage5 not derived from etl::imessage");
259 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage6 not derived from etl::imessage");
260 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage7 not derived from etl::imessage");
261 ETL_STATIC_ASSERT((etl::is_base_of<etl::imessage, TMessage1>::value),
"TMessage8 not derived from etl::imessage");
263 static ETL_CONSTANT
size_t max_size =
269 static ETL_CONSTANT
size_t max_alignment =
290 template <
typename TCounter>
291 template <
typename TMessage1,
typename... TMessages>
294 template <
typename TCounter>
295 template <
typename TMessage1,
typename... TMessages>
300 template <
typename TCounter>
301 template <
typename TMessage1,
typename TMessage2,
typename TMessage3,
typename TMessage4,
typename TMessage5,
typename TMessage6,
302 typename TMessage7,
typename TMessage8>
304 TMessage7, TMessage8>::max_size;
306 template <
typename TCounter>
307 template <
typename TMessage1,
typename TMessage2,
typename TMessage3,
typename TMessage4,
typename TMessage5,
typename TMessage6,
308 typename TMessage7,
typename TMessage8>
310 TMessage7, TMessage8>::max_alignment;
314#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:57
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:79
A pool for allocating reference counted messages.
Definition reference_counted_message_pool.h:94
void release(const etl::ireference_counted_message &rcmessage)
Destruct a message and send it back to the allocator.
Definition reference_counted_message_pool.h:191
reference_counted_message_pool(etl::imemory_block_allocator &memory_block_allocator_)
Constructor.
Definition reference_counted_message_pool.h:100
etl::reference_counted_message< TMessage, TCounter > * allocate(const TMessage &message)
Allocate a reference counted message from the pool.
Definition reference_counted_message_pool.h:138
etl::reference_counted_message< TMessage, TCounter > * allocate()
Allocate a reference counted message from the pool.
Definition reference_counted_message_pool.h:165
Definition reference_counted_message.h:69
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition exception.h:59
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1192
Definition reference_counted_message_pool.h:253