From 0cf4396fcb1166b1f68e9566e3b53e85c4b0f0a8 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 9 Mar 2024 10:11:00 +0000 Subject: [PATCH] #854 in-place construction of shared message --- include/etl/reference_counted_message.h | 8 ++-- include/etl/reference_counted_message_pool.h | 44 ++++++++++---------- include/etl/reference_counted_object.h | 8 ++-- include/etl/shared_message.h | 16 ++++--- test/test_shared_message.cpp | 24 ++++++----- 5 files changed, 51 insertions(+), 49 deletions(-) diff --git a/include/etl/reference_counted_message.h b/include/etl/reference_counted_message.h index 76c1a1029..e667e3c9e 100644 --- a/include/etl/reference_counted_message.h +++ b/include/etl/reference_counted_message.h @@ -74,9 +74,9 @@ namespace etl /// \param owner The message owner. /// \param args The constructor arguments. //*************************************************************************** - template - reference_counted_message(etl::ireference_counted_message_pool& owner_, Args&&... args) - : rc_object(etl::forward(args)...) + template + reference_counted_message(etl::ireference_counted_message_pool& owner_, TArgs&&... args) + : rc_object(etl::forward(args)...) , owner(owner_) { } @@ -225,4 +225,4 @@ namespace etl #endif } -#endif +#endif \ No newline at end of file diff --git a/include/etl/reference_counted_message_pool.h b/include/etl/reference_counted_message_pool.h index a0c8779af..72adfffd8 100644 --- a/include/etl/reference_counted_message_pool.h +++ b/include/etl/reference_counted_message_pool.h @@ -103,8 +103,8 @@ namespace etl //************************************************************************* /// Allocate a reference counted message from the pool. //************************************************************************* - template - etl::reference_counted_message* allocate(const TMessage*, Args&&... args) + template + etl::reference_counted_message* allocate(TArgs&&... args) { ETL_STATIC_ASSERT((etl::is_base_of::value), "Not a message type"); @@ -119,7 +119,7 @@ namespace etl if (p != ETL_NULLPTR) { - ::new(p) rcm_t(*this, etl::forward(args)...); + ::new(p) rcm_t(*this, etl::forward(args)...); } ETL_ASSERT((p != ETL_NULLPTR), ETL_ERROR(etl::reference_counted_message_pool_allocation_failure)); @@ -209,13 +209,13 @@ namespace etl // Size of the first pool message type. static constexpr size_t size1 = sizeof(etl::reference_counted_message); - // Maximum size of the the rest of the pool message types. + // Maximum size of the rest of the pool message types. static constexpr size_t size2 = pool_message_parameters::max_size; // Size of the first pool message type. static constexpr size_t alignment1 = etl::alignment_of>::value; - // Maximum size of the the rest of the pool message types. + // Maximum size of the rest of the pool message types. static constexpr size_t alignment2 = pool_message_parameters::max_alignment; public: @@ -243,8 +243,8 @@ namespace etl }; #else - template + template struct pool_message_parameters { ETL_STATIC_ASSERT((etl::is_base_of::value), "TMessage1 not derived from etl::imessage"); @@ -257,23 +257,23 @@ namespace etl ETL_STATIC_ASSERT((etl::is_base_of::value), "TMessage8 not derived from etl::imessage"); static ETL_CONSTANT size_t max_size = etl::largest, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message >::size; + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message >::size; static ETL_CONSTANT size_t max_alignment = etl::largest, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message, - etl::reference_counted_message >::alignment; + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message, + etl::reference_counted_message >::alignment; }; #endif @@ -317,4 +317,4 @@ namespace etl #endif } -#endif +#endif \ No newline at end of file diff --git a/include/etl/reference_counted_object.h b/include/etl/reference_counted_object.h index 82f0af560..3f81c4a86 100644 --- a/include/etl/reference_counted_object.h +++ b/include/etl/reference_counted_object.h @@ -226,9 +226,9 @@ namespace etl //*************************************************************************** /// Constructor. //*************************************************************************** - template - reference_counted_object(Args&&... args) - : object(etl::forward(args)...) + template + reference_counted_object(TArgs&&... args) + : object(etl::forward(args)...) { } @@ -285,4 +285,4 @@ namespace etl #endif } -#endif +#endif \ No newline at end of file diff --git a/include/etl/shared_message.h b/include/etl/shared_message.h index dbfce2363..36771ac75 100644 --- a/include/etl/shared_message.h +++ b/include/etl/shared_message.h @@ -52,11 +52,10 @@ namespace etl //************************************************************************* /// Creator for in-place instantiation //************************************************************************* - template - static shared_message create(TPool& owner, Args&&... args) + template + static shared_message create(TPool& owner, TArgs&&... args) { - const TMessage* msg = nullptr; - return shared_message(owner, msg, etl::forward(args)...); + return shared_message(owner, etl::type_tag(), etl::forward(args)...); } //************************************************************************* @@ -79,13 +78,13 @@ namespace etl //************************************************************************* /// Constructor //************************************************************************* - template - shared_message(TPool& owner, const TMessage* message, Args&&... args) + template + shared_message(TPool& owner, etl::type_tag, TArgs&&... args) { ETL_STATIC_ASSERT((etl::is_base_of::value), "TPool not derived from etl::ireference_counted_message_pool"); ETL_STATIC_ASSERT((etl::is_base_of::value), "TMessage not derived from etl::imessage"); - p_rcmessage = owner.allocate(message, etl::forward(args)...); + p_rcmessage = owner.template allocate(etl::forward(args)...); if (p_rcmessage != ETL_NULLPTR) { @@ -220,5 +219,4 @@ namespace etl }; } -#endif - +#endif \ No newline at end of file diff --git a/test/test_shared_message.cpp b/test/test_shared_message.cpp index da4e4db70..0ac310e01 100644 --- a/test/test_shared_message.cpp +++ b/test/test_shared_message.cpp @@ -50,25 +50,29 @@ namespace struct Message1 : public etl::message { Message1() - : i(0) + : message() + , i(0) { ++message_1_instantiations; } Message1(int i_) - : i(i_) + : message() + , i(i_) { ++message_1_instantiations; } Message1(const Message1& msg) - : i(msg.i) + : message() + , i(msg.i) { ++message_1_instantiations; } Message1(Message1&& msg) - : i(msg.i) + : message() + , i(msg.i) { ++message_1_instantiations; } @@ -176,7 +180,7 @@ namespace etl::fixed_sized_memory_block_allocator memory_allocator; + 4U> common_memory_allocator; class atomic_counted_message_factory : public etl::atomic_counted_message_pool { @@ -193,7 +197,7 @@ namespace } }; - atomic_counted_message_factory message_pool(memory_allocator); + atomic_counted_message_factory common_message_pool(common_memory_allocator); //************************************************************************* class Message2Allocator : public etl::ireference_counted_message_pool @@ -236,7 +240,7 @@ namespace message_1_instantiations = 0; #include "etl/private/diagnostic_pessimizing_move_push.h" - etl::shared_message sm (std::move(message_pool.create_message())); + etl::shared_message sm (std::move(common_message_pool.create_message())); #include "etl/private/diagnostic_pop.h" CHECK_EQUAL(1, sm.get_reference_count()); @@ -247,7 +251,7 @@ namespace TEST(test_move_constructor_with_parametrized_constructed_message) { #include "etl/private/diagnostic_pessimizing_move_push.h" - etl::shared_message sm(std::move(etl::shared_message(message_pool, Message1(1)))); + etl::shared_message sm(std::move(etl::shared_message(common_message_pool, Message1(1)))); #include "etl/private/diagnostic_pop.h" CHECK_EQUAL(1, sm.get_reference_count()); @@ -259,7 +263,7 @@ namespace message_1_instantiations = 0; #include "etl/private/diagnostic_pessimizing_move_push.h" - etl::shared_message sm (std::move(message_pool.create_message(1))); + etl::shared_message sm (std::move(common_message_pool.create_message(1))); #include "etl/private/diagnostic_pop.h" CHECK_EQUAL(1, sm.get_reference_count()); @@ -380,4 +384,4 @@ namespace CHECK_THROW(message_pool.release(temp), etl::reference_counted_message_pool_release_failure); } } -} +} \ No newline at end of file