diff --git a/CMakeLists.txt b/CMakeLists.txt index 93bb6dde..22401ff9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13 FATAL_ERROR) #----------------------------------------------------------------- # The project #----------------------------------------------------------------- -project (SolidFrame VERSION 10.0) +project (SolidFrame VERSION 11.0) message("SolidFrame version: ${PROJECT_VERSION} - ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") #----------------------------------------------------------------- @@ -126,6 +126,10 @@ set(SOLID_VERSION_PATCH ${PROJECT_VERSION_PATCH}) set(SYSTEM_BASIC_LIBRARIES "") + +option(SOLID_FRAME_AIO_REACTOR_USE_SPINLOCK "Use SpinLock on AIO Reactor" ON) +option(SOLID_MPRPC_USE_SHARED_PTR_MESSAGE "Use std::shared_ptr with mprpc::Message" OFF) + #----------------------------------------------------------------- # Per OS configuration #----------------------------------------------------------------- diff --git a/README.md b/README.md index 70f2c06d..81acaaac 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ Boost Software License - Version 1.0 - August 17th, 2003 * _InnerList_ - bidirectional list mapped over a vector/deque * _Stack_ - alternative to std::stack * _Queue_ - alternative to std:queue - * _WorkPool_ - generic thread pool + * _ThreadPool_ - generic thread pool * [__solid_serialization_v2__](#solid_serialization_v2): binary serialization/marshalling * _TypeMap_ * _binary::Serializer_ diff --git a/RELEASES.md b/RELEASES.md index 7d89f1e9..b03ffb71 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,5 +1,13 @@ # SolidFrame Releases +## Version 11.0 + +* utility: Improve SharedBuffer with local caching +* mprpc: switch to using SharedBuffer +* frame: Some improvements to Reactor and aio::Reactor +* utility: Introducing IntrusivePtr with support for collapse +* mprpc: Defaulting to InstrusivePtr for solid::frame::mprpc::Message. Use SOLID_MPRPC_USE_SHARED_PTR_MESSAGE build option to switch to std::shared_ptr. + ## Version 10.0 * (DONE) New Pimpl implementation which avoids the extra memory allocation similarly to solid::Any<> @@ -31,7 +39,7 @@ * (DONE) remove boost dependency * (DONE) Object -> Actor * (DONE) Overal fixes -* (DONE) Refactored solid::WorkPool<>. solid::CallPool<> +* (DONE) Refactored solid::ThreadPool<>. solid::CallPool<> ## Version 5.0 @@ -39,7 +47,7 @@ * (DONE) clang tidy support * (DONE) fix compilation on g++ 8.1.1 * (DONE) system/debug.hpp -> system/log.hpp - redesign debug logging engine. No locking while handling log line parameters. -* (DONE) utility/workpool.hpp -> improved locking for a better performance on macOS +* (DONE) utility/ThreadPool.hpp -> improved locking for a better performance on macOS * (DONE) mpipc: call connection pool close callback after calling connection close callback for every connection in the pool * (DONE) mpipc: improve connection pool with support for events like ConnectionActivated, PoolDisconnect, ConnectionStop diff --git a/cmake/check.config.cmake b/cmake/check.config.cmake index 66783bb2..302456f8 100644 --- a/cmake/check.config.cmake +++ b/cmake/check.config.cmake @@ -46,4 +46,4 @@ file (READ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/check/epoll2.cpp" source_code) CHECK_CXX_SOURCE_RUNS("${source_code}" SOLID_USE_EPOLL2) #TODO: -set(SOLID_FRAME_AIO_REACTOR_USE_SPINLOCK TRUE) \ No newline at end of file +#set(SOLID_FRAME_AIO_REACTOR_USE_SPINLOCK TRUE) \ No newline at end of file diff --git a/configure b/configure index ad905dfc..058dd844 100755 --- a/configure +++ b/configure @@ -76,6 +76,9 @@ print_usage(){ echo "7) create a debug Ninja build for C++17" echo "./configure -b debug -e ../external -f debug -g Ninja -P \"-DCMAKE_CXX_STANDARD=17\"" echo + echo "8) create release build with using std::shared_ptr for solid::frame::mprpc::Message" + echo "./configure -f release_sp -e ../external/ -g Ninja -P \"-DSOLID_MPRPC_USE_SHARED_PTR_MESSAGE=on\"" + echo exit } diff --git a/examples/frame/mprpc_echo/example_mprpc_echo.cpp b/examples/frame/mprpc_echo/example_mprpc_echo.cpp index 2780a640..1ec1328f 100644 --- a/examples/frame/mprpc_echo/example_mprpc_echo.cpp +++ b/examples/frame/mprpc_echo/example_mprpc_echo.cpp @@ -90,7 +90,7 @@ mutex mtx; condition_variable cnd; Params params; -void broadcast_message(frame::mprpc::Service& _rsvc, std::shared_ptr& _rmsgptr); +void broadcast_message(frame::mprpc::Service& _rsvc, frame::mprpc::MessagePointerT<>& _rmsgptr); } // namespace struct FirstMessage : frame::mprpc::Message { @@ -191,7 +191,7 @@ int main(int argc, char* argv[]) return 1; } } else { - std::shared_ptr msgptr(new FirstMessage(s)); + frame::mprpc::MessagePointerT<> msgptr = frame::mprpc::make_message(s); broadcast_message(ipcsvc, msgptr); } } while (s.size()); @@ -212,10 +212,10 @@ bool restart( [&](auto& _rmap) { _rmap.template registerMessage(1, "FirstMessage", []( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsend_msg, - std::shared_ptr& _rrecv_msg, - ErrorConditionT const& _rerr) { + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsend_msg, + frame::mprpc::MessagePointerT& _rrecv_msg, + ErrorConditionT const& _rerr) { if (_rrecv_msg) { solid_log(generic_logger, Info, _rctx.recipientId() << " Message received: is_on_sender: " << _rrecv_msg->isOnSender() << ", is_on_peer: " << _rrecv_msg->isOnPeer() << ", is_back_on_sender: " << _rrecv_msg->isBackOnSender()); if (_rrecv_msg->isOnPeer()) { @@ -341,7 +341,7 @@ std::string loadFile(const char* _path) namespace { -void broadcast_message(frame::mprpc::Service& _rsvc, std::shared_ptr& _rmsgptr) +void broadcast_message(frame::mprpc::Service& _rsvc, frame::mprpc::MessagePointerT& _rmsgptr) { solid_log(generic_logger, Verbose, "done stop==============================="); diff --git a/examples/utility/threadpool/example_threadpool.cpp b/examples/utility/threadpool/example_threadpool.cpp index 62eb1127..830086f5 100644 --- a/examples/utility/threadpool/example_threadpool.cpp +++ b/examples/utility/threadpool/example_threadpool.cpp @@ -1,4 +1,4 @@ -// example_workpool.cpp +// example_ThreadPool.cpp // // Copyright (c) 2007, 2008, 2018 Valentin Palade (vipalade @ gmail . com) // diff --git a/solid/frame/aio/aioreactor.hpp b/solid/frame/aio/aioreactor.hpp index 1020aa3d..4c0120a9 100644 --- a/solid/frame/aio/aioreactor.hpp +++ b/solid/frame/aio/aioreactor.hpp @@ -120,13 +120,13 @@ class Reactor : public frame::ReactorBase { #else using MutexT = mutex; #endif - const size_t wake_capacity_; - ReactorStatistic& rstatistic_; - size_t actor_count_{0}; - size_t current_exec_size_{0}; - alignas(hardware_destructive_interference_size) std::atomic_size_t pop_wake_index_{0}; - alignas(hardware_destructive_interference_size) std::atomic_size_t pending_wake_count_{0}; - alignas(hardware_destructive_interference_size) std::atomic_size_t push_wake_index_{0}; + const size_t wake_capacity_; + ReactorStatistic& rstatistic_; + size_t actor_count_{0}; + size_t current_exec_size_{0}; + size_t pop_wake_index_{0}; + std::atomic_size_t pending_wake_count_{0}; + std::atomic_size_t push_wake_index_{0}; public: using StatisticT = ReactorStatistic; @@ -531,7 +531,7 @@ class Reactor : public impl::Reactor { ReactorContext ctx(context(_rcrttime)); while (true) { - const size_t index = pop_wake_index_.load(std::memory_order_relaxed) % wake_capacity_; + const size_t index = pop_wake_index_ % wake_capacity_; auto& rstub = wake_arr_[index]; if (rstub.isFilled()) { if (rstub.actor_ptr_) [[unlikely]] { diff --git a/solid/frame/aio/src/aioreactor.cpp b/solid/frame/aio/src/aioreactor.cpp index eface118..f25b7923 100644 --- a/solid/frame/aio/src/aioreactor.cpp +++ b/solid/frame/aio/src/aioreactor.cpp @@ -269,7 +269,7 @@ struct impl::Reactor::Data { } } #elif defined(SOLID_USE_EPOLL) - int computeWaitDuration(NanoTime const& _rcrt, const bool _can_wait) const + int computeWaitDuration(NanoTime const& _rcrt, const bool _can_wait) const { if (!_can_wait) { diff --git a/solid/frame/aio/test/CMakeLists.txt b/solid/frame/aio/test/CMakeLists.txt index d9227000..edbfaf7f 100644 --- a/solid/frame/aio/test/CMakeLists.txt +++ b/solid/frame/aio/test/CMakeLists.txt @@ -124,7 +124,7 @@ if(OPENSSL_FOUND) add_test(NAME TestPerfActorAio COMMAND test_perf test_perf_actor_aio) add_test(NAME TestPerfTimeStore COMMAND test_perf test_perf_timestore) add_test(NAME TestPerfActorFrame COMMAND test_perf test_perf_actor_frame) - add_test(NAME TestPerfWorkPoolLockFree COMMAND test_perf test_perf_threadpool_lockfree) - add_test(NAME TestPerfWorkPoolSynchCtx COMMAND test_perf test_perf_threadpool_synch_context) + add_test(NAME TestPerfThreadPoolLockFree COMMAND test_perf test_perf_threadpool_lockfree) + add_test(NAME TestPerfThreadPoolSynchCtx COMMAND test_perf test_perf_threadpool_synch_context) endif(OPENSSL_FOUND) diff --git a/solid/frame/aio/test/test_echo_tcp_stress.cpp b/solid/frame/aio/test/test_echo_tcp_stress.cpp index af8b230d..5e00b430 100644 --- a/solid/frame/aio/test/test_echo_tcp_stress.cpp +++ b/solid/frame/aio/test/test_echo_tcp_stress.cpp @@ -450,7 +450,7 @@ class Connection final : public frame::aio::Actor { int test_echo_tcp_stress(int argc, char* argv[]) { - solid::log_start(std::cerr, {"solid::frame::aio.*:EWX", "\\*:VEWX", "solid::workpool:EWXS"}); + solid::log_start(std::cerr, {"solid::frame::aio.*:EWX", "\\*:VEWX", "solid::ThreadPool:EWXS"}); size_t connection_count = 1; diff --git a/solid/frame/aio/test/test_event_stress_wp.cpp b/solid/frame/aio/test/test_event_stress_wp.cpp index 32e015c7..818f9404 100644 --- a/solid/frame/aio/test/test_event_stress_wp.cpp +++ b/solid/frame/aio/test/test_event_stress_wp.cpp @@ -1,6 +1,6 @@ /* * This test is companion to test_event_stress. - * It tries to simulate the message passing from test_event_stress using Workpool instead of + * It tries to simulate the message passing from test_event_stress using ThreadPool instead of * actors and schedulers. */ @@ -257,7 +257,7 @@ int test_event_stress_wp(int argc, char* argv[]) solid_log(logger, Warning, "sleep - wait for locked threads"); this_thread::sleep_for(chrono::seconds(100)); solid_log(logger, Warning, "wake - waited for locked threads"); - // we must throw here otherwise it will crash because workpool(s) is/are used after destroy + // we must throw here otherwise it will crash because ThreadPool(s) is/are used after destroy solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } fut.get(); diff --git a/solid/frame/mprpc/CMakeLists.txt b/solid/frame/mprpc/CMakeLists.txt index 2551839d..5822ec13 100644 --- a/solid/frame/mprpc/CMakeLists.txt +++ b/solid/frame/mprpc/CMakeLists.txt @@ -16,6 +16,7 @@ set(Headers mprpcconfiguration.hpp mprpccontext.hpp mprpcerror.hpp + mprpcid.hpp mprpcmessage.hpp mprpcprotocol.hpp mprpcprotocol_serialization_v3.hpp diff --git a/solid/frame/mprpc/mprpcconfiguration.hpp b/solid/frame/mprpc/mprpcconfiguration.hpp index 2ba50aeb..ed110d0f 100644 --- a/solid/frame/mprpc/mprpcconfiguration.hpp +++ b/solid/frame/mprpc/mprpcconfiguration.hpp @@ -25,6 +25,7 @@ #include "solid/system/socketaddress.hpp" #include "solid/system/socketdevice.hpp" #include "solid/utility/function.hpp" +#include "solid/utility/sharedbuffer.hpp" #include namespace solid { @@ -50,7 +51,7 @@ class Configuration; typedef void (*OnSecureConnectF)(frame::aio::ReactorContext&); typedef void (*OnSecureAcceptF)(frame::aio::ReactorContext&); - +#if false struct BufferBase { virtual ~BufferBase(); @@ -102,6 +103,7 @@ using SendBufferPointerT = std::unique_ptr; using RecvBufferPointerT = std::shared_ptr; RecvBufferPointerT make_recv_buffer(const size_t _cp); +#endif enum struct RelayDataFlagsE : uint8_t { First, @@ -114,7 +116,7 @@ using RelayDataFlagsT = Flags; std::ostream& operator<<(std::ostream& _ros, const RelayDataFlagsT& _flags); struct RelayData { - RecvBufferPointerT bufptr_; + SharedBuffer buffer_; const char* pdata_ = nullptr; size_t data_size_ = 0; RelayData* pnext_ = nullptr; @@ -126,7 +128,7 @@ struct RelayData { RelayData( RelayData&& _rrelmsg) noexcept - : bufptr_(std::move(_rrelmsg.bufptr_)) + : buffer_(std::move(_rrelmsg.buffer_)) , pdata_(_rrelmsg.pdata_) , data_size_(_rrelmsg.data_size_) , pnext_(nullptr) @@ -138,7 +140,7 @@ struct RelayData { RelayData& operator=(RelayData&& _rrelmsg) noexcept { - bufptr_ = std::move(_rrelmsg.bufptr_); + buffer_ = std::move(_rrelmsg.buffer_); pdata_ = _rrelmsg.pdata_; data_size_ = _rrelmsg.data_size_; pnext_ = _rrelmsg.pnext_; @@ -156,7 +158,7 @@ struct RelayData { pdata_ = nullptr; data_size_ = 0; // connection_id_.clear(); - bufptr_.reset(); + buffer_.reset(); pnext_ = nullptr; flags_.reset(); message_flags_ = 0; @@ -191,11 +193,11 @@ struct RelayData { private: friend class Connection; RelayData( - RecvBufferPointerT& _bufptr, - const char* _pdata, - size_t _data_size, - const bool _is_last) - : bufptr_(_bufptr) + SharedBuffer& _buffer, + const char* _pdata, + size_t _data_size, + const bool _is_last) + : buffer_(_buffer) , pdata_(_pdata) , data_size_(_data_size) { @@ -214,7 +216,7 @@ class RelayEngine { protected: using PushFunctionT = solid_function_t(bool(RelayData*&, const MessageId&, MessageId&, bool&)); - using DoneFunctionT = solid_function_t(void(RecvBufferPointerT&)); + using DoneFunctionT = solid_function_t(void(SharedBuffer&)); using CancelFunctionT = solid_function_t(void(const MessageHeader&)); RelayEngine() {} @@ -335,8 +337,8 @@ using ClientSetupSocketDeviceFunctionT = solid_function_t(bool(SocketDe using ResolveCompleteFunctionT = solid_function_t(void(AddressVectorT&&)); using ConnectionStopFunctionT = solid_function_t(void(ConnectionContext&)); using ConnectionStartFunctionT = solid_function_t(void(ConnectionContext&)); -using SendAllocateBufferFunctionT = solid_function_t(SendBufferPointerT(const uint32_t)); -using RecvAllocateBufferFunctionT = solid_function_t(RecvBufferPointerT(const uint32_t)); +using SendAllocateBufferFunctionT = solid_function_t(SharedBuffer(const uint32_t)); +using RecvAllocateBufferFunctionT = solid_function_t(SharedBuffer(const uint32_t)); using CompressFunctionT = solid_function_t(size_t(char*, size_t, ErrorConditionT&)); using UncompressFunctionT = solid_function_t(size_t(char*, const char*, size_t, ErrorConditionT&)); using ExtractRecipientNameFunctionT = solid_function_t(const char*(const char*, std::string&, std::string&)); @@ -558,9 +560,9 @@ class Configuration { return !isServer() && isClient(); } - RecvBufferPointerT allocateRecvBuffer(uint8_t& _rbuffer_capacity_kb) const; + SharedBuffer allocateRecvBuffer() const; - SendBufferPointerT allocateSendBuffer(uint8_t& _rbuffer_capacity_kb) const; + SharedBuffer allocateSendBuffer() const; void check() const; diff --git a/solid/frame/mprpc/mprpccontext.hpp b/solid/frame/mprpc/mprpccontext.hpp index e249edbe..690ac09b 100644 --- a/solid/frame/mprpc/mprpccontext.hpp +++ b/solid/frame/mprpc/mprpccontext.hpp @@ -17,7 +17,8 @@ #include "solid/utility/any.hpp" -#include "solid/frame/common.hpp" +#include "solid/frame/mprpc/mprpcid.hpp" +#include "solid/frame/mprpc/mprpcmessage.hpp" #include "solid/frame/mprpc/mprpcmessageflags.hpp" #include "solid/reflection/reflection.hpp" @@ -42,229 +43,6 @@ class EngineCore; const LoggerT& service_logger(); -struct ConnectionContext; - -//! A structure to uniquely indetify an IPC connection pool -/*! - Overview:
- - Usage:
- -*/ -struct ConnectionPoolId : UniqueId { - ConnectionPoolId( - const size_t _idx = InvalidIndex(), - const uint32_t _uid = InvalidIndex()) - : UniqueId(_idx, _uid) - { - } -}; - -class RecipientId { - friend class Service; - friend class Connection; - friend struct ConnectionContext; - - ConnectionPoolId pool_id_; - ActorIdT connection_id_; - - RecipientId( - const ConnectionPoolId& _pool_id, - const ActorIdT& _connection_id) - : pool_id_(_pool_id) - , connection_id_(_connection_id) - { - } - -public: - RecipientId() {} - - RecipientId( - const RecipientId& _other) - : pool_id_(_other.pool_id_) - , connection_id_(_other.connection_id_) - { - } - - explicit RecipientId( - const ActorIdT& _connection_id) - : connection_id_(_connection_id) - { - } - - bool isValid() const - { - return isValidConnection() && isValidPool(); - } - - bool empty() const - { - return isInvalidConnection() && isInvalidPool(); - } - - bool isInvalid() const - { - return isInvalidConnection() || isInvalidPool(); - } - - bool isInvalidConnection() const - { - return connection_id_.isInvalid(); - } - - bool isValidConnection() const - { - return connection_id_.isValid(); - } - - bool isInvalidPool() const - { - return pool_id_.isInvalid(); - } - - bool isValidPool() const - { - return pool_id_.isValid(); - } - - ConnectionPoolId const& poolId() const - { - return pool_id_; - } - - ActorIdT const& connectionId() const - { - return connection_id_; - } - - void clear() - { - pool_id_.clear(); - connection_id_.clear(); - } - - SOLID_REFLECT_V1(_r, _rthis, _rctx) - { - _r.add(_rthis.pool_id_, _rctx, 1, "pool_id"); - _r.add(_rthis.connection_id_, _rctx, 2, "connection_id"); - } -}; - -inline bool operator<(RecipientId const& _rec_id1, RecipientId const& _rec_id2) -{ - if (_rec_id1.connectionId() < _rec_id2.connectionId()) { - return true; - } else if (_rec_id2.connectionId() < _rec_id1.connectionId()) { - return false; - } else { - return _rec_id1.poolId() < _rec_id2.poolId(); - } -} - -inline bool operator==(RecipientId const& _rec_id1, RecipientId const& _rec_id2) -{ - return _rec_id1.connectionId() == _rec_id2.connectionId() && _rec_id1.poolId() == _rec_id2.poolId(); -} - -std::ostream& operator<<(std::ostream& _ros, RecipientId const& _rec_id); - -struct RequestId { - uint32_t index; - uint32_t unique; - - bool isInvalid() const - { - return index == 0; - } - - bool isValid() const - { - return !isInvalid(); - } - - void clear() - { - index = 0; - unique = 0; - } - - bool operator==(const RequestId& _reqid) const - { - return index == _reqid.index && unique == _reqid.unique; - } - - RequestId( - const uint32_t _idx = 0, - const uint32_t _uid = 0) - : index(_idx) - , unique(_uid) - { - } -}; - -std::ostream& operator<<(std::ostream& _ros, RequestId const& _msguid); - -struct MessageId { - MessageId() - : index(InvalidIndex()) - , unique(0) - { - } - MessageId(MessageId const& _rmsguid) - : index(_rmsguid.index) - , unique(_rmsguid.unique) - { - } - - MessageId(RequestId const& _rrequid) - : index(_rrequid.index) - , unique(_rrequid.unique) - { - if (_rrequid.isInvalid()) { - index = InvalidIndex(); - } else { - --index; - } - } - - bool isInvalid() const - { - return index == InvalidIndex(); - } - - bool isValid() const - { - return !isInvalid(); - } - void clear() - { - index = InvalidIndex(); - unique = 0; - } - -private: - friend class Service; - friend class Connection; - friend class MessageWriter; - friend struct ConnectionPoolStub; - friend class relay::EngineCore; - - friend std::ostream& operator<<(std::ostream& _ros, MessageId const& _msguid); - - size_t index; - uint32_t unique; - - MessageId( - const size_t _idx, - const uint32_t _uid) - : index(_idx) - , unique(_uid) - { - } -}; - -std::ostream& operator<<(std::ostream& _ros, MessageId const& _msguid); - class Service; class Connection; class Configuration; @@ -322,7 +100,7 @@ struct ConnectionContext : NonCopyable { return message_id; } - std::shared_ptr fetchRequest(Message const& _rmsg) const; + MessagePointerT<> fetchRequest(Message const& _rmsg) const; //! Keep any connection data Any<>& any(); diff --git a/solid/frame/mprpc/mprpcid.hpp b/solid/frame/mprpc/mprpcid.hpp new file mode 100644 index 00000000..8f3ec727 --- /dev/null +++ b/solid/frame/mprpc/mprpcid.hpp @@ -0,0 +1,238 @@ +#pragma once + +#include "solid/frame/common.hpp" + +namespace solid { +namespace frame { +namespace mprpc { +namespace relay { +class EngineCore; +} + +class Service; +struct ConnectionContext; + +//! A structure to uniquely indetify an IPC connection pool +/*! + Overview:
+ + Usage:
+ +*/ +struct ConnectionPoolId : UniqueId { + ConnectionPoolId( + const size_t _idx = InvalidIndex(), + const uint32_t _uid = InvalidIndex()) + : UniqueId(_idx, _uid) + { + } +}; + +class RecipientId { + friend class Service; + friend class Connection; + friend struct ConnectionContext; + + ConnectionPoolId pool_id_; + ActorIdT connection_id_; + + RecipientId( + const ConnectionPoolId& _pool_id, + const ActorIdT& _connection_id) + : pool_id_(_pool_id) + , connection_id_(_connection_id) + { + } + +public: + RecipientId() {} + + RecipientId( + const RecipientId& _other) + : pool_id_(_other.pool_id_) + , connection_id_(_other.connection_id_) + { + } + + explicit RecipientId( + const ActorIdT& _connection_id) + : connection_id_(_connection_id) + { + } + + bool isValid() const + { + return isValidConnection() && isValidPool(); + } + + bool empty() const + { + return isInvalidConnection() && isInvalidPool(); + } + + bool isInvalid() const + { + return isInvalidConnection() || isInvalidPool(); + } + + bool isInvalidConnection() const + { + return connection_id_.isInvalid(); + } + + bool isValidConnection() const + { + return connection_id_.isValid(); + } + + bool isInvalidPool() const + { + return pool_id_.isInvalid(); + } + + bool isValidPool() const + { + return pool_id_.isValid(); + } + + ConnectionPoolId const& poolId() const + { + return pool_id_; + } + + ActorIdT const& connectionId() const + { + return connection_id_; + } + + void clear() + { + pool_id_.clear(); + connection_id_.clear(); + } + + SOLID_REFLECT_V1(_r, _rthis, _rctx) + { + _r.add(_rthis.pool_id_, _rctx, 1, "pool_id"); + _r.add(_rthis.connection_id_, _rctx, 2, "connection_id"); + } +}; + +inline bool operator<(RecipientId const& _rec_id1, RecipientId const& _rec_id2) +{ + if (_rec_id1.connectionId() < _rec_id2.connectionId()) { + return true; + } else if (_rec_id2.connectionId() < _rec_id1.connectionId()) { + return false; + } else { + return _rec_id1.poolId() < _rec_id2.poolId(); + } +} + +inline bool operator==(RecipientId const& _rec_id1, RecipientId const& _rec_id2) +{ + return _rec_id1.connectionId() == _rec_id2.connectionId() && _rec_id1.poolId() == _rec_id2.poolId(); +} + +std::ostream& operator<<(std::ostream& _ros, RecipientId const& _rec_id); + +struct RequestId { + uint32_t index; + uint32_t unique; + + bool isInvalid() const + { + return index == 0; + } + + bool isValid() const + { + return !isInvalid(); + } + + void clear() + { + index = 0; + unique = 0; + } + + bool operator==(const RequestId& _reqid) const + { + return index == _reqid.index && unique == _reqid.unique; + } + + RequestId( + const uint32_t _idx = 0, + const uint32_t _uid = 0) + : index(_idx) + , unique(_uid) + { + } +}; + +std::ostream& operator<<(std::ostream& _ros, RequestId const& _msguid); + +struct MessageId { + MessageId() + : index(InvalidIndex()) + , unique(0) + { + } + MessageId(MessageId const& _rmsguid) + : index(_rmsguid.index) + , unique(_rmsguid.unique) + { + } + + MessageId(RequestId const& _rrequid) + : index(_rrequid.index) + , unique(_rrequid.unique) + { + if (_rrequid.isInvalid()) { + index = InvalidIndex(); + } else { + --index; + } + } + + bool isInvalid() const + { + return index == InvalidIndex(); + } + + bool isValid() const + { + return !isInvalid(); + } + void clear() + { + index = InvalidIndex(); + unique = 0; + } + +private: + friend class Service; + friend class Connection; + friend class MessageWriter; + friend struct ConnectionPoolStub; + friend class relay::EngineCore; + + friend std::ostream& operator<<(std::ostream& _ros, MessageId const& _msguid); + + size_t index; + uint32_t unique; + + MessageId( + const size_t _idx, + const uint32_t _uid) + : index(_idx) + , unique(_uid) + { + } +}; + +std::ostream& operator<<(std::ostream& _ros, MessageId const& _msguid); + +} // namespace mprpc +} // namespace frame +} // namespace solid \ No newline at end of file diff --git a/solid/frame/mprpc/mprpcmessage.hpp b/solid/frame/mprpc/mprpcmessage.hpp index 02155183..c5492f8d 100644 --- a/solid/frame/mprpc/mprpcmessage.hpp +++ b/solid/frame/mprpc/mprpcmessage.hpp @@ -10,17 +10,22 @@ #pragma once +#include +#include + #include "solid/system/common.hpp" #include "solid/system/exception.hpp" #include "solid/utility/cacheable.hpp" #include "solid/utility/function.hpp" #include "solid/utility/typetraits.hpp" -#include "solid/frame/mprpc/mprpccontext.hpp" +#include "solid/frame/mprpc/mprpcid.hpp" #include "solid/frame/mprpc/mprpcmessageflags.hpp" #include "solid/reflection/v1/reflection.hpp" -#include -#include + +#if !defined(SOLID_MPRPC_USE_SHARED_PTR_MESSAGE) +#include "solid/utility/intrusiveptr.hpp" +#endif namespace solid { namespace frame { @@ -28,6 +33,7 @@ namespace mprpc { class Service; class Connection; +class ConnectionContext; struct MessageRelayHeader { std::string uri_; @@ -143,8 +149,11 @@ struct MessageHeader { } } }; - -struct Message : Cacheable { +#if defined(SOLID_MPRPC_USE_SHARED_PTR_MESSAGE) +struct Message : SharedCacheable { +#else +struct Message : IntrusiveCacheable { +#endif using FlagsT = MessageFlagsValueT; @@ -277,10 +286,7 @@ struct Message : Cacheable { header_ = _umh; } - void header(frame::mprpc::ConnectionContext& _rctx) - { - header_ = std::move(*_rctx.pmessage_header); - } + void header(frame::mprpc::ConnectionContext& _rctx); const MessageHeader& header() const { @@ -371,10 +377,30 @@ struct Message : Cacheable { MessageHeader header_; }; -using MessagePointerT = std::shared_ptr; +#if defined(SOLID_MPRPC_USE_SHARED_PTR_MESSAGE) +template +using MessagePointerT = std::shared_ptr; + +template +MessagePointerT make_message(Args&&... _args) +{ + return std::make_shared(std::forward(_args)...); +} + +#else +template +using MessagePointerT = IntrusivePtr; + +template +MessagePointerT make_message(Args&&... _args) +{ + return make_intrusive(std::forward(_args)...); +} + +#endif using MessageCompleteFunctionT = solid_function_t(void( - ConnectionContext&, MessagePointerT&, MessagePointerT&, ErrorConditionT const&)); + ConnectionContext&, MessagePointerT<>&, MessagePointerT<>&, ErrorConditionT const&)); } // namespace mprpc } // namespace frame diff --git a/solid/frame/mprpc/mprpcprotocol.hpp b/solid/frame/mprpc/mprpcprotocol.hpp index 13690942..ad8b408c 100644 --- a/solid/frame/mprpc/mprpcprotocol.hpp +++ b/solid/frame/mprpc/mprpcprotocol.hpp @@ -12,6 +12,7 @@ #include "solid/frame/mprpc/mprpcerror.hpp" #include "solid/frame/mprpc/mprpcmessage.hpp" +#include "solid/utility/cast.hpp" #include "solid/utility/function.hpp" #include @@ -26,25 +27,25 @@ template struct message_complete_traits; template -struct message_complete_traits&, std::shared_ptr&, ErrorConditionT const&)> { +struct message_complete_traits&, MessagePointerT&, ErrorConditionT const&)> { typedef Req send_type; typedef Res recv_type; }; template -struct message_complete_traits&, std::shared_ptr&, ErrorConditionT const&)> { +struct message_complete_traits&, MessagePointerT&, ErrorConditionT const&)> { typedef Req send_type; typedef Res recv_type; }; template -struct message_complete_traits&, std::shared_ptr&, ErrorConditionT const&)> { +struct message_complete_traits&, MessagePointerT&, ErrorConditionT const&)> { typedef Req send_type; typedef Res recv_type; }; template -struct message_complete_traits&, std::shared_ptr&, ErrorConditionT const&) const> { +struct message_complete_traits&, MessagePointerT&, ErrorConditionT const&) const> { typedef Req send_type; typedef Res recv_type; }; @@ -73,17 +74,13 @@ struct CompleteHandler { void operator()( ConnectionContext& _rctx, - MessagePointerT& _rreq_msg_ptr, - MessagePointerT& _rres_msg_ptr, + MessagePointerT<>& _rreq_msg_ptr, + MessagePointerT<>& _rres_msg_ptr, ErrorConditionT const& _err) { - // Req *prequest = dynamic_cast(_rreq_msg_ptr.get()); - std::shared_ptr req_msg_ptr(std::dynamic_pointer_cast(_rreq_msg_ptr)); - - // Res *presponse = dynamic_cast(_rres_msg_ptr.get()); - std::shared_ptr res_msg_ptr(std::dynamic_pointer_cast(_rres_msg_ptr)); - - ErrorConditionT error(_err); + MessagePointerT req_msg_ptr(solid::dynamic_pointer_cast(_rreq_msg_ptr)); + MessagePointerT res_msg_ptr(solid::dynamic_pointer_cast(_rres_msg_ptr)); + ErrorConditionT error(_err); if (!error && _rreq_msg_ptr && !req_msg_ptr) { error = error_service_bad_cast_request; @@ -102,12 +99,12 @@ class Deserializer { using PointerT = std::unique_ptr; virtual ~Deserializer(); - virtual ptrdiff_t run(ConnectionContext&, const char* _pdata, size_t _data_len, MessageHeader& _rmsghdr) = 0; - virtual ptrdiff_t run(ConnectionContext&, const char* _pdata, size_t _data_len, MessagePointerT& _rmsgptr) = 0; - virtual ptrdiff_t run(ConnectionContext&, const char* _pdata, size_t _data_len) = 0; - virtual ErrorConditionT error() const = 0; - virtual bool empty() const = 0; - virtual void clear() = 0; + virtual ptrdiff_t run(ConnectionContext&, const char* _pdata, size_t _data_len, MessageHeader& _rmsghdr) = 0; + virtual ptrdiff_t run(ConnectionContext&, const char* _pdata, size_t _data_len, MessagePointerT<>& _rmsgptr) = 0; + virtual ptrdiff_t run(ConnectionContext&, const char* _pdata, size_t _data_len) = 0; + virtual ErrorConditionT error() const = 0; + virtual bool empty() const = 0; + virtual void clear() = 0; void link(PointerT& _ptr) { @@ -132,12 +129,12 @@ class Serializer { using PointerT = std::unique_ptr; virtual ~Serializer(); - virtual ptrdiff_t run(ConnectionContext&, char* _pdata, size_t _data_len, MessageHeader& _rmsghdr) = 0; - virtual ptrdiff_t run(ConnectionContext&, char* _pdata, size_t _data_len, MessagePointerT& _rmsgptr, const size_t _msg_type_idx = 0) = 0; - virtual ptrdiff_t run(ConnectionContext&, char* _pdata, size_t _data_len) = 0; - virtual ErrorConditionT error() const = 0; - virtual bool empty() const = 0; - virtual void clear() = 0; + virtual ptrdiff_t run(ConnectionContext&, char* _pdata, size_t _data_len, MessageHeader& _rmsghdr) = 0; + virtual ptrdiff_t run(ConnectionContext&, char* _pdata, size_t _data_len, MessagePointerT<>& _rmsgptr, const size_t _msg_type_idx = 0) = 0; + virtual ptrdiff_t run(ConnectionContext&, char* _pdata, size_t _data_len) = 0; + virtual ErrorConditionT error() const = 0; + virtual bool empty() const = 0; + virtual void clear() = 0; void link(PointerT& _ptr) { @@ -191,7 +188,7 @@ class Protocol : NonCopyable { virtual size_t typeIndex(const Message* _pmsg) const = 0; // virtual const TypeStub& operator[](const size_t _idx) const = 0; - virtual void complete(const size_t _idx, ConnectionContext&, MessagePointerT&, MessagePointerT&, ErrorConditionT const&) const = 0; + virtual void complete(const size_t _idx, ConnectionContext&, MessagePointerT<>&, MessagePointerT<>&, ErrorConditionT const&) const = 0; virtual Serializer::PointerT createSerializer(const WriterConfiguration& _rconf) const = 0; virtual Deserializer::PointerT createDeserializer(const ReaderConfiguration& _rconf) const = 0; diff --git a/solid/frame/mprpc/mprpcprotocol_serialization_v3.hpp b/solid/frame/mprpc/mprpcprotocol_serialization_v3.hpp index f31bad0f..259b208d 100644 --- a/solid/frame/mprpc/mprpcprotocol_serialization_v3.hpp +++ b/solid/frame/mprpc/mprpcprotocol_serialization_v3.hpp @@ -53,7 +53,7 @@ class Serializer : public mprpc::Serializer { _pdata, static_cast(_data_len), [&_rmsghdr](SerializerT& _rs, ConnectionContext& _rctx) { _rs.add(_rmsghdr, _rctx, 0, "header"); }, _rctx); } - ptrdiff_t run(ConnectionContext& _rctx, char* _pdata, size_t _data_len, MessagePointerT& _rmsgptr, const size_t /*_msg_type_idx*/) override + ptrdiff_t run(ConnectionContext& _rctx, char* _pdata, size_t _data_len, MessagePointerT<>& _rmsgptr, const size_t /*_msg_type_idx*/) override { return ser_.run( _pdata, static_cast(_data_len), [&_rmsgptr](SerializerT& _rs, ConnectionContext& _rctx) { _rs.add(_rmsgptr, _rctx, 0, "message"); }, _rctx); @@ -98,7 +98,7 @@ class Deserializer : public mprpc::Deserializer { _pdata, static_cast(_data_len), [&_rmsghdr](DeserializerT& _rd, ConnectionContext& _rctx) mutable { _rd.add(_rmsghdr, _rctx, 0, "header"); }, _rctx); } - ptrdiff_t run(ConnectionContext& _rctx, const char* _pdata, size_t _data_len, MessagePointerT& _rmsgptr) override + ptrdiff_t run(ConnectionContext& _rctx, const char* _pdata, size_t _data_len, MessagePointerT<>& _rmsgptr) override { return des_.run( _pdata, static_cast(_data_len), [&_rmsgptr](DeserializerT& _rd, ConnectionContext& _rctx) { _rd.add(_rmsgptr, _rctx, 0, "message"); }, _rctx); @@ -142,7 +142,7 @@ class Protocol : public mprpc::Protocol { TypeData() {} - void complete(ConnectionContext& _rctx, MessagePointerT& _p1, MessagePointerT& _p2, ErrorConditionT const& _e) const + void complete(ConnectionContext& _rctx, MessagePointerT<>& _p1, MessagePointerT<>& _p2, ErrorConditionT const& _e) const { complete_fnc_(_rctx, _p1, _p2, _e); } @@ -219,8 +219,12 @@ class Protocol : public mprpc::Protocol { auto create_lambda = [](auto& _rctx, auto& _rptr) { using PtrType = std::decay_t; using CtxType = std::decay_t; +#if defined(SOLID_MPRPC_USE_SHARED_PTR_MESSAGE) if constexpr (solid::is_shared_ptr_v) { - _rptr = std::make_shared(); +#else + if constexpr (solid::is_intrusive_ptr_v) { +#endif + _rptr = make_message(); if constexpr (std::is_same_v) { _rptr->header(_rctx); } @@ -247,8 +251,11 @@ class Protocol : public mprpc::Protocol { auto create_lambda = [_create_fnc](auto& _rctx, auto& _rptr) { using PtrType = std::decay_t; using CtxType = std::decay_t; +#if defined(SOLID_MPRPC_USE_SHARED_PTR_MESSAGE) if constexpr (solid::is_shared_ptr_v) { - +#else + if constexpr (solid::is_intrusive_ptr_v) { +#endif _create_fnc(_rctx, _rptr); if constexpr (std::is_same_v) { @@ -331,7 +338,7 @@ class Protocol : public mprpc::Protocol { return type_map_.index(_pmsg); } - void complete(const size_t _idx, ConnectionContext& _rctx, MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerr) const override + void complete(const size_t _idx, ConnectionContext& _rctx, MessagePointerT<>& _rsent_msg_ptr, MessagePointerT<>& _rrecv_msg_ptr, ErrorConditionT const& _rerr) const override { type_data_vec_[_idx].complete(_rctx, _rsent_msg_ptr, _rrecv_msg_ptr, _rerr); } diff --git a/solid/frame/mprpc/mprpcservice.hpp b/solid/frame/mprpc/mprpcservice.hpp index aceb4239..0fba7c38 100644 --- a/solid/frame/mprpc/mprpcservice.hpp +++ b/solid/frame/mprpc/mprpcservice.hpp @@ -13,6 +13,7 @@ #include "solid/system/exception.hpp" #include "solid/system/statistic.hpp" +#include "solid/utility/cast.hpp" #include "solid/utility/event.hpp" #include "solid/utility/function.hpp" @@ -228,20 +229,20 @@ class Service : public frame::Service { template ErrorConditionT sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags = 0); template ErrorConditionT sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, RecipientId& _rrecipient_id, const MessageFlagsT& _flags = 0); template ErrorConditionT sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, RecipientId& _rrecipient_id, MessageId& _rmsg_id, const MessageFlagsT& _flags = 0); @@ -251,13 +252,13 @@ class Service : public frame::Service { template ErrorConditionT sendMessage( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags = 0); template ErrorConditionT sendMessage( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, MessageId& _rmsg_id, const MessageFlagsT& _flags = 0); @@ -266,14 +267,14 @@ class Service : public frame::Service { template ErrorConditionT sendRequest( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags = 0); template ErrorConditionT sendRequest( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, RecipientId& _rrecipient_id, const MessageFlagsT& _flags = 0); @@ -281,7 +282,7 @@ class Service : public frame::Service { template ErrorConditionT sendRequest( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, RecipientId& _rrecipient_id, MessageId& _rmsguid, @@ -292,13 +293,13 @@ class Service : public frame::Service { template ErrorConditionT sendResponse( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags = 0); template ErrorConditionT sendResponse( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, MessageId& _rmsg_id, const MessageFlagsT& _flags = 0); @@ -307,14 +308,14 @@ class Service : public frame::Service { template ErrorConditionT sendRequest( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags = 0); template ErrorConditionT sendRequest( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, MessageId& _rmsguid, const MessageFlagsT& _flags = 0); @@ -323,14 +324,14 @@ class Service : public frame::Service { template ErrorConditionT sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags); template ErrorConditionT sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, RecipientId& _rrecipient_id, const MessageFlagsT& _flags); @@ -338,7 +339,7 @@ class Service : public frame::Service { template ErrorConditionT sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, RecipientId& _rrecipient_id, MessageId& _rmsguid, @@ -348,14 +349,14 @@ class Service : public frame::Service { template ErrorConditionT sendMessage( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags); template ErrorConditionT sendMessage( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, MessageId& _rmsguid, const MessageFlagsT& _flags); @@ -365,19 +366,19 @@ class Service : public frame::Service { template ErrorConditionT sendResponse( ConnectionContext& _rctx, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags = 0); template ErrorConditionT sendMessage( ConnectionContext& _rctx, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags = 0); template ErrorConditionT sendMessage( ConnectionContext& _rctx, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags); @@ -570,7 +571,7 @@ class Service : public frame::Service { ErrorConditionT doSendMessage( const char* _recipient_url, const RecipientId& _rrecipient_id_in, - MessagePointerT& _rmsgptr, + MessagePointerT<>& _rmsgptr, MessageCompleteFunctionT& _rcomplete_fnc, RecipientId* _precipient_id_out, MessageId* _pmsg_id_out, @@ -578,7 +579,7 @@ class Service : public frame::Service { ErrorConditionT doSendMessage( ConnectionContext& _rctx, - MessagePointerT& _rmsgptr, + MessagePointerT<>& _rmsgptr, MessageCompleteFunctionT& _rcomplete_fnc, RecipientId* _precipient_id_out, MessageId* _pmsg_id_out, @@ -608,10 +609,10 @@ using ServiceT = frame::ServiceShell; template ErrorConditionT Service::sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; MessageCompleteFunctionT complete_handler; return doSendMessage(_recipient_url.data(), recipient_id, msgptr, complete_handler, nullptr, nullptr, _flags); @@ -620,11 +621,11 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, RecipientId& _rrecipient_id, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; MessageCompleteFunctionT complete_handler; return doSendMessage(_recipient_url.data(), recipient_id, msgptr, complete_handler, &_rrecipient_id, nullptr, _flags); @@ -633,12 +634,12 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, RecipientId& _rrecipient_id, MessageId& _rmsg_id, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; MessageCompleteFunctionT complete_handler; return doSendMessage(_recipient_url.data(), recipient_id, msgptr, complete_handler, &_rrecipient_id, &_rmsg_id, _flags); @@ -647,10 +648,10 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); MessageCompleteFunctionT complete_handler; return doSendMessage(nullptr, _rrecipient_id, msgptr, complete_handler, nullptr, nullptr, _flags); } @@ -658,11 +659,11 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, MessageId& _rmsg_id, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); MessageCompleteFunctionT complete_handler; return doSendMessage(nullptr, _rrecipient_id, msgptr, complete_handler, nullptr, &_rmsg_id, _flags); } @@ -671,7 +672,7 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendRequest( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags) { @@ -679,7 +680,7 @@ ErrorConditionT Service::sendRequest( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -690,7 +691,7 @@ ErrorConditionT Service::sendRequest( template ErrorConditionT Service::sendRequest( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, RecipientId& _rrecipient_id, const MessageFlagsT& _flags) @@ -699,7 +700,7 @@ ErrorConditionT Service::sendRequest( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -710,7 +711,7 @@ ErrorConditionT Service::sendRequest( template ErrorConditionT Service::sendRequest( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, RecipientId& _rrecipient_id, MessageId& _rmsguid, @@ -720,7 +721,7 @@ ErrorConditionT Service::sendRequest( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -732,7 +733,7 @@ ErrorConditionT Service::sendRequest( template ErrorConditionT Service::sendRequest( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags) { @@ -740,7 +741,7 @@ ErrorConditionT Service::sendRequest( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -750,7 +751,7 @@ ErrorConditionT Service::sendRequest( template ErrorConditionT Service::sendRequest( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, MessageId& _rmsguid, const MessageFlagsT& _flags) @@ -759,7 +760,7 @@ ErrorConditionT Service::sendRequest( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -772,10 +773,10 @@ ErrorConditionT Service::sendRequest( template ErrorConditionT Service::sendResponse( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); MessageCompleteFunctionT complete_handler; return doSendMessage(nullptr, _rrecipient_id, msgptr, complete_handler, nullptr, nullptr, _flags | MessageFlagsE::Response); } @@ -785,11 +786,11 @@ ErrorConditionT Service::sendResponse( template ErrorConditionT Service::sendResponse( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, MessageId& _rmsg_id, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); MessageCompleteFunctionT complete_handler; return doSendMessage(nullptr, _rrecipient_id, msgptr, complete_handler, nullptr, &_rmsg_id, _flags | MessageFlagsE::Response); } @@ -799,7 +800,7 @@ ErrorConditionT Service::sendResponse( template ErrorConditionT Service::sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags) { @@ -807,7 +808,7 @@ ErrorConditionT Service::sendMessage( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -818,7 +819,7 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, RecipientId& _rrecipient_id, const MessageFlagsT& _flags) @@ -827,7 +828,7 @@ ErrorConditionT Service::sendMessage( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -838,7 +839,7 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( const std::string_view& _recipient_url, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, RecipientId& _rrecipient_id, MessageId& _rmsguid, @@ -848,7 +849,7 @@ ErrorConditionT Service::sendMessage( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); RecipientId recipient_id; CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -860,7 +861,7 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags) { @@ -868,7 +869,7 @@ ErrorConditionT Service::sendMessage( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -878,7 +879,7 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( RecipientId const& _rrecipient_id, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, MessageId& _rmsguid, const MessageFlagsT& _flags) @@ -887,7 +888,7 @@ ErrorConditionT Service::sendMessage( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -899,10 +900,10 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendResponse( ConnectionContext& _rctx, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); MessageCompleteFunctionT complete_handler; return doSendMessage(_rctx, msgptr, complete_handler, nullptr, nullptr, _flags | MessageFlagsE::Response); } @@ -910,10 +911,10 @@ ErrorConditionT Service::sendResponse( template ErrorConditionT Service::sendMessage( ConnectionContext& _rctx, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, const MessageFlagsT& _flags) { - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); MessageCompleteFunctionT complete_handler; return doSendMessage(_rctx, msgptr, complete_handler, nullptr, nullptr, _flags); } @@ -921,7 +922,7 @@ ErrorConditionT Service::sendMessage( template ErrorConditionT Service::sendMessage( ConnectionContext& _rctx, - std::shared_ptr const& _rmsgptr, + MessagePointerT const& _rmsgptr, Fnc _complete_fnc, const MessageFlagsT& _flags) { @@ -929,7 +930,7 @@ ErrorConditionT Service::sendMessage( typename message_complete_traits::send_type, typename message_complete_traits::recv_type>; - MessagePointerT msgptr(std::static_pointer_cast(_rmsgptr)); + auto msgptr(solid::static_pointer_cast(_rmsgptr)); CompleteHandlerT fnc(std::forward(_complete_fnc)); MessageCompleteFunctionT complete_handler(std::move(fnc)); @@ -941,7 +942,7 @@ ErrorConditionT Service::forceCloseConnectionPool( RecipientId const& _rrecipient_id, F _f) { - auto fnc = [_f](ConnectionContext& _rctx, MessagePointerT& /*_rmsgptr*/, MessagePointerT&, ErrorConditionT const& /*_err*/) { + auto fnc = [_f](ConnectionContext& _rctx, MessagePointerT<>& /*_rmsgptr*/, MessagePointerT<>&, ErrorConditionT const& /*_err*/) { _f(_rctx); }; @@ -954,7 +955,7 @@ ErrorConditionT Service::delayCloseConnectionPool( RecipientId const& _rrecipient_id, F _f) { - auto fnc = [_f](ConnectionContext& _rctx, MessagePointerT& /*_rmsgptr*/, MessagePointerT&, ErrorConditionT const& /*_err*/) { + auto fnc = [_f](ConnectionContext& _rctx, MessagePointerT<>& /*_rmsgptr*/, MessagePointerT<>&, ErrorConditionT const& /*_err*/) { _f(_rctx); }; diff --git a/solid/frame/mprpc/src/mprpcconfiguration.cpp b/solid/frame/mprpc/src/mprpcconfiguration.cpp index 71cc3df1..cd5284f5 100644 --- a/solid/frame/mprpc/src/mprpcconfiguration.cpp +++ b/solid/frame/mprpc/src/mprpcconfiguration.cpp @@ -39,6 +39,7 @@ std::ostream& operator<<(std::ostream& _ros, const RelayDataFlagsT& _flags) return _ros; } +#if false /*virtual*/ BufferBase::~BufferBase() { } @@ -66,16 +67,17 @@ RecvBufferPointerT make_recv_buffer(const size_t _cp) return std::make_shared>(_cp); } } +#endif namespace { -RecvBufferPointerT default_allocate_recv_buffer(const uint32_t _cp) +SharedBuffer default_allocate_recv_buffer(const uint32_t _cp) { - return make_recv_buffer(_cp); + return BufferManager::make(_cp); } -SendBufferPointerT default_allocate_send_buffer(const uint32_t _cp) +SharedBuffer default_allocate_send_buffer(const uint32_t _cp) { - return SendBufferPointerT(new char[_cp]); + return make_shared_buffer(_cp); } // void empty_reset_serializer_limits(ConnectionContext &, serialization::binary::Limits&){} @@ -416,24 +418,14 @@ void Configuration::createListenerDevice(SocketDevice& _rsd) const } //----------------------------------------------------------------------------- -RecvBufferPointerT Configuration::allocateRecvBuffer(uint8_t& _rbuffer_capacity_kb) const +SharedBuffer Configuration::allocateRecvBuffer() const { - if (_rbuffer_capacity_kb == 0) { - _rbuffer_capacity_kb = connection_recv_buffer_start_capacity_kb; - } else if (_rbuffer_capacity_kb > connection_recv_buffer_max_capacity_kb) { - _rbuffer_capacity_kb = connection_recv_buffer_max_capacity_kb; - } - return connection_recv_buffer_allocate_fnc(_rbuffer_capacity_kb * 1024); + return connection_recv_buffer_allocate_fnc(connection_recv_buffer_start_capacity_kb * 1024); } //----------------------------------------------------------------------------- -SendBufferPointerT Configuration::allocateSendBuffer(uint8_t& _rbuffer_capacity_kb) const +SharedBuffer Configuration::allocateSendBuffer() const { - if (_rbuffer_capacity_kb == 0) { - _rbuffer_capacity_kb = connection_send_buffer_start_capacity_kb; - } else if (_rbuffer_capacity_kb > connection_send_buffer_max_capacity_kb) { - _rbuffer_capacity_kb = connection_send_buffer_max_capacity_kb; - } - return connection_send_buffer_allocate_fnc(_rbuffer_capacity_kb * 1024); + return connection_send_buffer_allocate_fnc(connection_send_buffer_start_capacity_kb * 1024); } //----------------------------------------------------------------------------- } // namespace mprpc diff --git a/solid/frame/mprpc/src/mprpcconnection.cpp b/solid/frame/mprpc/src/mprpcconnection.cpp index 68529325..84747263 100644 --- a/solid/frame/mprpc/src/mprpcconnection.cpp +++ b/solid/frame/mprpc/src/mprpcconnection.cpp @@ -231,25 +231,24 @@ struct RecvRaw { //----------------------------------------------------------------------------- inline void Connection::doOptimizeRecvBuffer() { - const size_t cnssz = recv_buf_off_ - cons_buf_off_; - if (cnssz <= cons_buf_off_) { + const size_t remaining_size = recv_buf_.size() - cons_buf_off_; + if (remaining_size <= cons_buf_off_) { // idbgx(Debug::proto_bin, this<<' '<<"memcopy "<& _rmsg_ptr, const size_t _msg_type_id) override { // if (rcon_.doCompleteMessage(rctx_, _rmsg_ptr, _msg_type_id)) { { @@ -1624,18 +1613,18 @@ struct Connection::Receiver : MessageReader::Receiver { unsigned repeatcnt = 4; char* pbuf = nullptr; size_t bufsz = 0; - const uint32_t recvbufcp = rthis.recvBufferCapacity(); + const uint32_t recvbufcp = rthis.recv_buf_.capacity(); Receiver rcvr(rthis, _rctx, rconfig.reader, rconfig.protocol(), conctx); ErrorConditionT error; do { solid_log(logger, Verbose, &rthis << " received size " << _sz); - rthis.service(_rctx).wstatistic().connectionRecvBufferSize(_sz, rthis.recvBufferCapacity()); + rthis.service(_rctx).wstatistic().connectionRecvBufferSize(_sz, rthis.recv_buf_.capacity()); if (!_rctx.error()) { - rthis.recv_buf_off_ += _sz; - pbuf = rthis.recv_buf_->data() + rthis.cons_buf_off_; - bufsz = rthis.recv_buf_off_ - rthis.cons_buf_off_; + rthis.recv_buf_.append(_sz); + pbuf = rthis.recv_buf_.data() + rthis.cons_buf_off_; + bufsz = rthis.recv_buf_.size() - rthis.cons_buf_off_; rcvr.request_buffer_ack_count_ = 0; @@ -1665,9 +1654,9 @@ struct Connection::Receiver : MessageReader::Receiver { solid_assert_log(rthis.recv_buf_, logger); - pbuf = rthis.recv_buf_->data() + rthis.recv_buf_off_; + pbuf = rthis.recv_buf_.data() + rthis.recv_buf_.size(); - bufsz = recvbufcp - rthis.recv_buf_off_; + bufsz = recvbufcp - rthis.recv_buf_.size(); // solid_log(logger, Info, &rthis<<" buffer size "<sendAll(_rctx, buffer.data(), buffer.size())) { sent_something = true; if (_rctx.error()) { @@ -1869,7 +1858,7 @@ void Connection::doSend(frame::aio::ReactorContext& _rctx) //----------------------------------------------------------------------------- struct Connection::SenderResponse : Connection::Sender { - MessagePointerT& rresponse_ptr_; + MessagePointerT<>& rresponse_ptr_; bool request_found_; @@ -1879,7 +1868,7 @@ struct Connection::SenderResponse : Connection::Sender { WriterConfiguration const& _rconfig, Protocol const& _rproto, ConnectionContext& _rconctx, - MessagePointerT& _rresponse_ptr) + MessagePointerT<>& _rresponse_ptr) : Connection::Sender(_rcon, _rctx, _rconfig, _rproto, _rconctx) , rresponse_ptr_(_rresponse_ptr) , request_found_(false) @@ -1909,7 +1898,7 @@ struct Connection::SenderResponse : Connection::Sender { } }; -bool Connection::doCompleteMessage(frame::aio::ReactorContext& _rctx, MessagePointerT& _rresponse_ptr, const size_t _response_type_id) +bool Connection::doCompleteMessage(frame::aio::ReactorContext& _rctx, MessagePointerT<>& _rresponse_ptr, const size_t _response_type_id) { ConnectionContext conctx(service(_rctx), *this); const Configuration& rconfig = service(_rctx).configuration(); @@ -1945,7 +1934,7 @@ void Connection::doCompleteMessage( const Protocol& rproto = rconfig.protocol(); // const Configuration &rconfig = service(_rctx).configuration(); - MessagePointerT dummy_recv_msg_ptr; + MessagePointerT<> dummy_recv_msg_ptr; conctx.message_flags = _rmsg_bundle.message_flags; conctx.message_id = _rpool_msg_id; @@ -2000,8 +1989,8 @@ void Connection::doCancelRelayed( const Configuration& rconfig = service(_rctx).configuration(); size_t ack_buf_cnt = 0; - const auto done_lambda = [this, &ack_buf_cnt](RecvBufferPointerT& _rbuf) { - if (_rbuf.use_count() == 1) { + const auto done_lambda = [this, &ack_buf_cnt](SharedBuffer& _rbuf) { + if (_rbuf.useCount() == 1) { ++ack_buf_cnt; this->recv_buf_vec_.emplace_back(std::move(_rbuf)); } @@ -2221,7 +2210,7 @@ Any<>& ConnectionContext::any() return rconnection.any(); } //----------------------------------------------------------------------------- -MessagePointerT ConnectionContext::fetchRequest(Message const& _rmsg) const +MessagePointerT<> ConnectionContext::fetchRequest(Message const& _rmsg) const { return rconnection.fetchRequest(_rmsg); } @@ -2312,6 +2301,14 @@ Connection& ConnectionProxy::connection(frame::aio::ReactorContext& _rctx) const return static_cast(_rctx.actor()); } //----------------------------------------------------------------------------- +// Message +//----------------------------------------------------------------------------- + +void Message::header(frame::mprpc::ConnectionContext& _rctx) +{ + header_ = std::move(*_rctx.pmessage_header); +} + } // namespace mprpc } // namespace frame } // namespace solid diff --git a/solid/frame/mprpc/src/mprpcconnection.hpp b/solid/frame/mprpc/src/mprpcconnection.hpp index 624492ba..0970ff6c 100644 --- a/solid/frame/mprpc/src/mprpcconnection.hpp +++ b/solid/frame/mprpc/src/mprpcconnection.hpp @@ -33,7 +33,6 @@ namespace aio { namespace openssl { class Context; } // namespace openssl - } // namespace aio namespace mprpc { @@ -139,7 +138,7 @@ class Connection final : public frame::aio::Actor { void relayId(const UniqueId& _relay_id); - MessagePointerT fetchRequest(Message const& _rmsg) const; + MessagePointerT<> fetchRequest(Message const& _rmsg) const; ConnectionPoolId const& poolId() const; const std::string& poolName() const; @@ -167,23 +166,6 @@ class Connection final : public frame::aio::Actor { msg_writer_.forEveryMessagesNewerToOlder(fnc); } -#if 0 - template - void forEveryMessagesNewerToOlder( - Fnc const& _f) - { - auto visit_fnc = [this, &_f]( - MessageBundle& _rmsgbundle, - MessageId const& _rmsgid, - RelayData* /*_prelay_data*/ - ) { - _f(this->poolId(), _rmsgbundle, _rmsgid); - }; - MessageWriter::VisitFunctionT fnc(std::cref(visit_fnc)); - - msg_writer_.forEveryMessagesNewerToOlder(fnc); - } -#endif static void onSendAllRaw(frame::aio::ReactorContext& _rctx, EventBase& _revent); static void onRecvSomeRaw(frame::aio::ReactorContext& _rctx, const size_t _sz, EventBase& _revent); @@ -192,10 +174,6 @@ class Connection final : public frame::aio::Actor { static void onRecv(frame::aio::ReactorContext& _rctx, size_t _sz); static void onSend(frame::aio::ReactorContext& _rctx); static void onConnect(frame::aio::ReactorContext& _rctx); - // static void onTimerInactivity(frame::aio::ReactorContext& _rctx); - // static void onTimerKeepalive(frame::aio::ReactorContext& _rctx); - // static void onTimerWaitSecured(frame::aio::ReactorContext& _rctx); - // static void onTimerWaitActivation(frame::aio::ReactorContext& _rctx); static void onTimer(frame::aio::ReactorContext& _rctx); static void onSecureConnect(frame::aio::ReactorContext& _rctx); static void onSecureAccept(frame::aio::ReactorContext& _rctx); @@ -240,10 +218,6 @@ class Connection final : public frame::aio::Actor { void doSend(frame::aio::ReactorContext& _rctx); - // SocketDevice const & device()const{ - // return sock.device(); - // } - void doActivate( frame::aio::ReactorContext& _rctx, EventBase& _revent); @@ -253,14 +227,11 @@ class Connection final : public frame::aio::Actor { void doPrepare(frame::aio::ReactorContext& _rctx); void doUnprepare(frame::aio::ReactorContext& _rctx); void doResetTimer(frame::aio::ReactorContext& _rctx); - // void doResetTimerStart(frame::aio::ReactorContext& _rctx); - // void doResetTimerSend(frame::aio::ReactorContext& _rctx); - // void doResetTimerRecv(frame::aio::ReactorContext& _rctx); ResponseStateE doCheckResponseState(frame::aio::ReactorContext& _rctx, const MessageHeader& _rmsghdr, MessageId& _rrelay_id, const bool _erase_request); bool doCompleteMessage( - frame::aio::ReactorContext& _rctx, MessagePointerT& _rresponse_ptr, const size_t _response_type_id); + frame::aio::ReactorContext& _rctx, MessagePointerT<>& _rresponse_ptr, const size_t _response_type_id); void doCompleteMessage( solid::frame::aio::ReactorContext& _rctx, @@ -336,24 +307,15 @@ class Connection final : public frame::aio::Actor { void doResetRecvBuffer(frame::aio::ReactorContext& _rctx, const uint8_t _request_buffer_ack_count, ErrorConditionT& _rerr); private: - bool postSendAll(frame::aio::ReactorContext& _rctx, const char* _pbuf, size_t _bufcp, EventBase& _revent); - bool postRecvSome(frame::aio::ReactorContext& _rctx, char* _pbuf, size_t _bufcp); - bool postRecvSome(frame::aio::ReactorContext& _rctx, char* _pbuf, size_t _bufcp, EventBase& _revent); - bool hasValidSocket() const; - bool connect(frame::aio::ReactorContext& _rctx, const SocketAddressInet& _raddr); - bool recvSome(frame::aio::ReactorContext& _rctx, char* _buf, size_t _bufcp, size_t& _sz); - bool hasPendingSend() const; - bool sendAll(frame::aio::ReactorContext& _rctx, char* _buf, size_t _bufcp); - void prepareSocket(frame::aio::ReactorContext& _rctx); - - uint32_t recvBufferCapacity() const - { - return recv_buf_cp_kb_ * 1024; - } - uint32_t sendBufferCapacity() const - { - return send_buf_cp_kb_ * 1024; - } + bool postSendAll(frame::aio::ReactorContext& _rctx, const char* _pbuf, size_t _bufcp, EventBase& _revent); + bool postRecvSome(frame::aio::ReactorContext& _rctx, char* _pbuf, size_t _bufcp); + bool postRecvSome(frame::aio::ReactorContext& _rctx, char* _pbuf, size_t _bufcp, EventBase& _revent); + bool hasValidSocket() const; + bool connect(frame::aio::ReactorContext& _rctx, const SocketAddressInet& _raddr); + bool recvSome(frame::aio::ReactorContext& _rctx, char* _buf, size_t _bufcp, size_t& _sz); + bool hasPendingSend() const; + bool sendAll(frame::aio::ReactorContext& _rctx, char* _buf, size_t _bufcp); + void prepareSocket(frame::aio::ReactorContext& _rctx); const NanoTime& minTimeout() const; private: @@ -374,10 +336,9 @@ class Connection final : public frame::aio::Actor { }; using TimerT = frame::aio::SteadyTimer; - using SendBufferVectorT = std::vector; using FlagsT = solid::Flags; using RequestIdVectorT = MessageWriter::RequestIdVectorT; - using RecvBufferVectorT = std::vector; + using RecvBufferVectorT = std::vector; struct Receiver; friend struct Receiver; @@ -390,17 +351,14 @@ class Connection final : public frame::aio::Actor { const std::string& rpool_name_; TimerT timer_; FlagsT flags_; - size_t recv_buf_off_; size_t cons_buf_off_; uint32_t recv_keepalive_count_; uint16_t recv_buf_count_; - RecvBufferPointerT recv_buf_; + SharedBuffer recv_buf_; RecvBufferVectorT recv_buf_vec_; - SendBufferPointerT send_buf_; + SharedBuffer send_buf_; uint8_t send_relay_free_count_; uint8_t ackd_buf_count_; - uint8_t recv_buf_cp_kb_; // kilobytes - uint8_t send_buf_cp_kb_; // kilobytes MessageIdVectorT pending_message_vec_; MessageReader msg_reader_; MessageWriter msg_writer_; @@ -428,7 +386,7 @@ inline Any<>& Connection::any() return any_data_; } -inline MessagePointerT Connection::fetchRequest(Message const& _rmsg) const +inline MessagePointerT<> Connection::fetchRequest(Message const& _rmsg) const { return msg_writer_.fetchRequest(_rmsg.requestId()); } diff --git a/solid/frame/mprpc/src/mprpcmessagereader.cpp b/solid/frame/mprpc/src/mprpcmessagereader.cpp index e5972511..4269edf0 100644 --- a/solid/frame/mprpc/src/mprpcmessagereader.cpp +++ b/solid/frame/mprpc/src/mprpcmessagereader.cpp @@ -311,7 +311,7 @@ const char* MessageReader::doConsumeMessage( if ((_cmd & static_cast(PacketHeader::CommandE::EndMessageFlag)) != 0u) { if (rmsgstub.deserializer_ptr_->empty() && rmsgstub.message_ptr_) { // done parsing the message body - MessagePointerT msgptr{std::move(rmsgstub.message_ptr_)}; + MessagePointerT<> msgptr{std::move(rmsgstub.message_ptr_)}; cache(rmsgstub.deserializer_ptr_); solid_log(logger, Verbose, "Clear Message " << _msgidx); rmsgstub.clear(); diff --git a/solid/frame/mprpc/src/mprpcmessagereader.hpp b/solid/frame/mprpc/src/mprpcmessagereader.hpp index 6ae0be64..4699f849 100644 --- a/solid/frame/mprpc/src/mprpcmessagereader.hpp +++ b/solid/frame/mprpc/src/mprpcmessagereader.hpp @@ -48,10 +48,10 @@ class MessageReader { virtual ~Receiver(); - virtual void receiveMessage(MessagePointerT&, const size_t /*_msg_type_id*/) = 0; - virtual void receiveKeepAlive() = 0; - virtual void receiveAckCount(uint8_t _count) = 0; - virtual void receiveCancelRequest(const RequestId&) = 0; + virtual void receiveMessage(MessagePointerT<>&, const size_t /*_msg_type_id*/) = 0; + virtual void receiveKeepAlive() = 0; + virtual void receiveAckCount(uint8_t _count) = 0; + virtual void receiveCancelRequest(const RequestId&) = 0; virtual bool receiveRelayStart(MessageHeader& _rmsghdr, const char* _pbeg, size_t _sz, MessageId& _rrelay_id, const bool _is_last, ErrorConditionT& _rerror); virtual bool receiveRelayBody(const char* _pbeg, size_t _sz, const MessageId& _rrelay_id, const bool _is_last, ErrorConditionT& _rerror); virtual bool receiveRelayResponse(MessageHeader& _rmsghdr, const char* _pbeg, size_t _sz, const MessageId& _rrelay_id, const bool _is_last, ErrorConditionT& _rerror); @@ -112,7 +112,7 @@ class MessageReader { RelayResponse, }; - MessagePointerT message_ptr_; + MessagePointerT<> message_ptr_; Deserializer::PointerT deserializer_ptr_; MessageHeader message_header_; size_t packet_count_; diff --git a/solid/frame/mprpc/src/mprpcmessagewriter.cpp b/solid/frame/mprpc/src/mprpcmessagewriter.cpp index 133b6e0f..35024042 100644 --- a/solid/frame/mprpc/src/mprpcmessagewriter.cpp +++ b/solid/frame/mprpc/src/mprpcmessagewriter.cpp @@ -244,13 +244,13 @@ void MessageWriter::cancel( } } //----------------------------------------------------------------------------- -MessagePointerT MessageWriter::fetchRequest(MessageId const& _rmsguid) const +MessagePointerT<> MessageWriter::fetchRequest(MessageId const& _rmsguid) const { if (_rmsguid.isValid() && _rmsguid.index < message_vec_.size() && _rmsguid.unique == message_vec_[_rmsguid.index].unique_) { const MessageStub& rmsgstub = message_vec_[_rmsguid.index]; - return MessagePointerT(rmsgstub.msgbundle_.message_ptr); + return MessagePointerT<>(rmsgstub.msgbundle_.message_ptr); } - return MessagePointerT(); + return MessagePointerT<>(); } //----------------------------------------------------------------------------- ResponseStateE MessageWriter::checkResponseState(MessageId const& _rmsguid, MessageId& _rrelay_id, const bool _erase_request) diff --git a/solid/frame/mprpc/src/mprpcmessagewriter.hpp b/solid/frame/mprpc/src/mprpcmessagewriter.hpp index 8f6decc8..b7c678c9 100644 --- a/solid/frame/mprpc/src/mprpcmessagewriter.hpp +++ b/solid/frame/mprpc/src/mprpcmessagewriter.hpp @@ -121,7 +121,7 @@ class MessageWriter { void cancel(MessageId const& _rmsguid, Sender& _rsender, const bool _force = false); - MessagePointerT fetchRequest(MessageId const& _rmsguid) const; + MessagePointerT<> fetchRequest(MessageId const& _rmsguid) const; ResponseStateE checkResponseState(MessageId const& _rmsguid, MessageId& _rrelay_id, const bool _erase_request); diff --git a/solid/frame/mprpc/src/mprpcrelayengine.cpp b/solid/frame/mprpc/src/mprpcrelayengine.cpp index 09c2a6b2..406b7286 100644 --- a/solid/frame/mprpc/src/mprpcrelayengine.cpp +++ b/solid/frame/mprpc/src/mprpcrelayengine.cpp @@ -769,7 +769,7 @@ void EngineCore::doPollNew(const UniqueId& _rrelay_con_uid, PushFunctionT& _try_ solid_log(logger, Verbose, ""); // the connection has received the SendCancel event for the message, // we can now safely delete the message - solid_assert_log(!rmsg.pfront_->bufptr_, logger); + solid_assert_log(!rmsg.pfront_->buffer_, logger); solid_assert_log(pnext == nullptr, logger); if (rmsg.sender_con_id_.isValid()) { @@ -817,7 +817,7 @@ void EngineCore::doPollDone(const UniqueId& _rrelay_con_uid, DoneFunctionT& _don RelayData* prd = rcon.pdone_relay_data_top_; while (prd != nullptr) { - _done_fnc(prd->bufptr_); + _done_fnc(prd->buffer_); RelayData* ptmprd = prd->pnext_; prd->clear(); impl_->eraseRelayData(prd); @@ -835,7 +835,7 @@ void EngineCore::doPollDone(const UniqueId& _rrelay_con_uid, DoneFunctionT& _don solid_assert_log(rmsg.receiver_con_id_.isInvalid(), logger); while ((prd = rmsg.pop()) != nullptr) { - _done_fnc(prd->bufptr_); + _done_fnc(prd->buffer_); prd->clear(); impl_->eraseRelayData(prd); } @@ -968,7 +968,7 @@ void EngineCore::doCancel( prd = rsndcon.pdone_relay_data_top_; while (prd != nullptr) { - _done_fnc(prd->bufptr_); + _done_fnc(prd->buffer_); RelayData* ptmprd = prd->pnext_; prd->clear(); impl_->eraseRelayData(prd); @@ -1071,7 +1071,7 @@ void EngineCore::doCancel( } if (_prelay_data != nullptr) { - solid_assert_log(!_prelay_data->bufptr_, logger); + solid_assert_log(!_prelay_data->buffer_, logger); _prelay_data->clear(); impl_->eraseRelayData(_prelay_data); } diff --git a/solid/frame/mprpc/src/mprpcservice.cpp b/solid/frame/mprpc/src/mprpcservice.cpp index 9e75c776..e7a96223 100644 --- a/solid/frame/mprpc/src/mprpcservice.cpp +++ b/solid/frame/mprpc/src/mprpcservice.cpp @@ -116,7 +116,7 @@ struct MessageStub : inner::Node { uint flags_; MessageStub( - MessagePointerT&& _rmsgptr, + MessagePointerT<>&& _rmsgptr, const size_t _msg_type_idx, MessageCompleteFunctionT& _rcomplete_fnc, ulong _msgflags, @@ -291,7 +291,7 @@ struct ConnectionPoolStub : inner::Node& _rmsgptr, const size_t _msg_type_idx, MessageCompleteFunctionT& _rcomplete_fnc, const MessageFlagsT& _flags, @@ -316,7 +316,7 @@ struct ConnectionPoolStub : inner::Node& _rmsgptr, const size_t _msg_type_idx, MessageCompleteFunctionT& _rcomplete_fnc, const MessageFlagsT& _flags, @@ -341,7 +341,7 @@ struct ConnectionPoolStub : inner::Node& _rmsgptr, const size_t _msg_type_idx, MessageCompleteFunctionT& _rcomplete_fnc, const MessageFlagsT& _flags, @@ -365,7 +365,7 @@ struct ConnectionPoolStub : inner::Node& _rmsgptr, const size_t _msg_type_idx, MessageCompleteFunctionT& _rcomplete_fnc, const MessageFlagsT& _flags, @@ -664,7 +664,7 @@ struct Service::Data { ErrorConditionT doSendMessageToConnection( Service& _rsvc, const RecipientId& _rrecipient_id_in, - MessagePointerT& _rmsgptr, + MessagePointerT<>& _rmsgptr, MessageCompleteFunctionT& _rcomplete_fnc, MessageId* _pmsg_id_out, MessageFlagsT _flags, @@ -744,7 +744,7 @@ struct Service::Data { bool doTryNotifyPoolWaitingConnection(Service& _rsvc, const size_t _pool_index); ErrorConditionT doSendMessageToPool( - Service& _rsvc, const ConnectionPoolId& _rpool_id, MessagePointerT& _rmsgptr, + Service& _rsvc, const ConnectionPoolId& _rpool_id, MessagePointerT<>& _rmsgptr, MessageCompleteFunctionT& _rcomplete_fnc, const size_t _msg_type_idx, std::string&& _message_url, @@ -1029,7 +1029,7 @@ ErrorConditionT Service::Data::doLockPool( //----------------------------------------------------------------------------- ErrorConditionT Service::doSendMessage( ConnectionContext& _rctx, - MessagePointerT& _rmsgptr, + MessagePointerT<>& _rmsgptr, MessageCompleteFunctionT& _rcomplete_fnc, RecipientId* _precipient_id_out, MessageId* _pmsg_id_out, @@ -1070,7 +1070,7 @@ ErrorConditionT Service::doSendMessage( ErrorConditionT Service::doSendMessage( const char* _recipient_url, const RecipientId& _rrecipient_id_in, - MessagePointerT& _rmsgptr, + MessagePointerT<>& _rmsgptr, MessageCompleteFunctionT& _rcomplete_fnc, RecipientId* _precipient_id_out, MessageId* _pmsgid_out, @@ -1186,7 +1186,7 @@ ErrorConditionT Service::doSendMessage( ErrorConditionT Service::Data::doSendMessageToConnection( Service& _rsvc, const RecipientId& _rrecipient_id_in, - MessagePointerT& _rmsgptr, + MessagePointerT<>& _rmsgptr, MessageCompleteFunctionT& _rcomplete_fnc, MessageId* _pmsgid_out, MessageFlagsT _flags, @@ -1264,7 +1264,7 @@ ErrorConditionT Service::Data::doSendMessageToConnection( } //----------------------------------------------------------------------------- ErrorConditionT Service::Data::doSendMessageToPool( - Service& _rsvc, const ConnectionPoolId& _rpool_id, MessagePointerT& _rmsgptr, + Service& _rsvc, const ConnectionPoolId& _rpool_id, MessagePointerT<>& _rmsgptr, MessageCompleteFunctionT& _rcomplete_fnc, const size_t _msg_type_idx, std::string&& _message_url, @@ -1632,9 +1632,9 @@ ErrorConditionT Service::doDelayCloseConnectionPool( } } - MessagePointerT empty_msg_ptr; - bool is_first; - const MessageId msgid = rpool.pushBackMessage(empty_msg_ptr, 0, _rcomplete_fnc, 0, std::string{}, is_first); + MessagePointerT<> empty_msg_ptr; + bool is_first; + const MessageId msgid = rpool.pushBackMessage(empty_msg_ptr, 0, _rcomplete_fnc, 0, std::string{}, is_first); (void)msgid; // notify all waiting connections about the new message @@ -1683,9 +1683,9 @@ ErrorConditionT Service::doForceCloseConnectionPool( } } - MessagePointerT empty_msg_ptr; - bool is_first; - const MessageId msgid = rpool.pushBackMessage(empty_msg_ptr, 0, _rcomplete_fnc, {MessageFlagsE::Synchronous}, std::string{}, is_first); + MessagePointerT<> empty_msg_ptr; + bool is_first; + const MessageId msgid = rpool.pushBackMessage(empty_msg_ptr, 0, _rcomplete_fnc, {MessageFlagsE::Synchronous}, std::string{}, is_first); (void)msgid; // no reason to cancel all messages - they'll be handled on connection stop. diff --git a/solid/frame/mprpc/src/mprpcutility.hpp b/solid/frame/mprpc/src/mprpcutility.hpp index 0038da51..6388631c 100644 --- a/solid/frame/mprpc/src/mprpcutility.hpp +++ b/solid/frame/mprpc/src/mprpcutility.hpp @@ -169,7 +169,7 @@ struct PacketHeader { struct MessageBundle { size_t message_type_id; MessageFlagsT message_flags; - MessagePointerT message_ptr; + MessagePointerT<> message_ptr; MessageCompleteFunctionT complete_fnc; MessageRelayHeader message_relay_header_; @@ -180,7 +180,7 @@ struct MessageBundle { } MessageBundle( - MessagePointerT&& _rmsgptr, + MessagePointerT<>&& _rmsgptr, const size_t _msg_type_idx, const MessageFlagsT& _flags, MessageCompleteFunctionT& _complete_fnc, @@ -194,7 +194,7 @@ struct MessageBundle { } MessageBundle( - MessagePointerT&& _rmsgptr, + MessagePointerT<>&& _rmsgptr, const size_t _msg_type_idx, const MessageFlagsT& _flags, MessageCompleteFunctionT& _complete_fnc) diff --git a/solid/frame/mprpc/test/multiprotocol_basic/alpha/client/alphaclient.cpp b/solid/frame/mprpc/test/multiprotocol_basic/alpha/client/alphaclient.cpp index 09c8cff9..bd40cae2 100644 --- a/solid/frame/mprpc/test/multiprotocol_basic/alpha/client/alphaclient.cpp +++ b/solid/frame/mprpc/test/multiprotocol_basic/alpha/client/alphaclient.cpp @@ -25,17 +25,17 @@ void client_connection_start(frame::mprpc::ConnectionContext& _rctx) template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror); + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror); template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -53,10 +53,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -74,10 +74,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -134,25 +134,25 @@ ErrorConditionT start( cfg.client.name_resolve_fnc = frame::mprpc::InternetResolverF(_rctx.rresolver, _rctx.rserver_port.c_str() /*, SocketInfo::Inet4*/); - mprpcclient_ptr = std::make_shared(_rctx.rm); + mprpcclient_ptr = make_shared(_rctx.rm); mprpcclient_ptr->start(std::move(cfg)); #if 1 _rctx.rwait_count += 3; err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(100000, make_string(100000)), + "localhost", frame::mprpc::make_message(100000UL, make_string(100000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; } err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(200000, make_string(200000)), + "localhost", frame::mprpc::make_message(200000UL, make_string(200000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; } err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(30000, make_string(30000)), + "localhost", frame::mprpc::make_message(30000UL, make_string(30000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; diff --git a/solid/frame/mprpc/test/multiprotocol_basic/alpha/server/alphaserver.cpp b/solid/frame/mprpc/test/multiprotocol_basic/alpha/server/alphaserver.cpp index c8923d1e..b4f3fb50 100644 --- a/solid/frame/mprpc/test/multiprotocol_basic/alpha/server/alphaserver.cpp +++ b/solid/frame/mprpc/test/multiprotocol_basic/alpha/server/alphaserver.cpp @@ -9,10 +9,10 @@ namespace alpha_server { template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); @@ -31,10 +31,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -51,10 +51,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); diff --git a/solid/frame/mprpc/test/multiprotocol_basic/alpha/server/alphaserver.hpp b/solid/frame/mprpc/test/multiprotocol_basic/alpha/server/alphaserver.hpp index 8889d201..a63245ca 100644 --- a/solid/frame/mprpc/test/multiprotocol_basic/alpha/server/alphaserver.hpp +++ b/solid/frame/mprpc/test/multiprotocol_basic/alpha/server/alphaserver.hpp @@ -7,10 +7,10 @@ namespace alpha_server { template void complete_message( - solid::frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - solid::ErrorConditionT const& _rerror); + solid::frame::mprpc::ConnectionContext& _rctx, + solid::frame::mprpc::MessagePointerT& _rsent_msg_ptr, + solid::frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + solid::ErrorConditionT const& _rerror); template void register_messages(Reg& _rmap) diff --git a/solid/frame/mprpc/test/multiprotocol_basic/beta/client/betaclient.cpp b/solid/frame/mprpc/test/multiprotocol_basic/beta/client/betaclient.cpp index ec893727..7930345f 100644 --- a/solid/frame/mprpc/test/multiprotocol_basic/beta/client/betaclient.cpp +++ b/solid/frame/mprpc/test/multiprotocol_basic/beta/client/betaclient.cpp @@ -22,10 +22,10 @@ void client_connection_start(frame::mprpc::ConnectionContext& _rctx) } void complete_message_first( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -42,10 +42,10 @@ void complete_message_first( } void complete_message_second( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -62,10 +62,10 @@ void complete_message_second( } void complete_message_third( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -128,25 +128,25 @@ ErrorConditionT start( cfg.client.name_resolve_fnc = frame::mprpc::InternetResolverF(_rctx.rresolver, _rctx.rserver_port.c_str() /*, SocketInfo::Inet4*/); - mprpcclient_ptr = std::make_shared(_rctx.rm); + mprpcclient_ptr = make_shared(_rctx.rm); mprpcclient_ptr->start(std::move(cfg)); #if 1 _rctx.rwait_count += 3; err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(100000, make_string(100000)), + "localhost", frame::mprpc::make_message(100000UL, make_string(100000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; } err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(200000, make_string(200000)), + "localhost", frame::mprpc::make_message(200000UL, make_string(200000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; } err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(30000, make_string(30000)), + "localhost", frame::mprpc::make_message(30000UL, make_string(30000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; diff --git a/solid/frame/mprpc/test/multiprotocol_basic/beta/server/betaserver.cpp b/solid/frame/mprpc/test/multiprotocol_basic/beta/server/betaserver.cpp index 2be340b3..5bd6bccc 100644 --- a/solid/frame/mprpc/test/multiprotocol_basic/beta/server/betaserver.cpp +++ b/solid/frame/mprpc/test/multiprotocol_basic/beta/server/betaserver.cpp @@ -10,10 +10,10 @@ namespace beta_server { template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -22,7 +22,7 @@ void complete_message( ErrorConditionT err = _rctx.service().sendResponse( _rctx.recipientId(), - std::make_shared(std::move(*_rrecv_msg_ptr))); + frame::mprpc::make_message(std::move(*_rrecv_msg_ptr))); solid_check(!err, "Connection id should not be invalid! " << err.message()); } @@ -33,10 +33,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -53,10 +53,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -65,7 +65,7 @@ void complete_message( ErrorConditionT err = _rctx.service().sendResponse( _rctx.recipientId(), - std::make_shared(std::move(*_rrecv_msg_ptr))); + frame::mprpc::make_message(std::move(*_rrecv_msg_ptr))); solid_check(!err, "Connection id should not be invalid! " << err.message()); } diff --git a/solid/frame/mprpc/test/multiprotocol_basic/beta/server/betaserver.hpp b/solid/frame/mprpc/test/multiprotocol_basic/beta/server/betaserver.hpp index b5ec07d5..d9d543c7 100644 --- a/solid/frame/mprpc/test/multiprotocol_basic/beta/server/betaserver.hpp +++ b/solid/frame/mprpc/test/multiprotocol_basic/beta/server/betaserver.hpp @@ -7,10 +7,10 @@ namespace beta_server { template void complete_message( - solid::frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - solid::ErrorConditionT const& _rerror); + solid::frame::mprpc::ConnectionContext& _rctx, + solid::frame::mprpc::MessagePointerT& _rsent_msg_ptr, + solid::frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + solid::ErrorConditionT const& _rerror); template void register_messages(Reg& _rmap) diff --git a/solid/frame/mprpc/test/multiprotocol_basic/gamma/client/gammaclient.cpp b/solid/frame/mprpc/test/multiprotocol_basic/gamma/client/gammaclient.cpp index 6e0e7b0b..9de9f58d 100644 --- a/solid/frame/mprpc/test/multiprotocol_basic/gamma/client/gammaclient.cpp +++ b/solid/frame/mprpc/test/multiprotocol_basic/gamma/client/gammaclient.cpp @@ -23,10 +23,10 @@ void client_connection_start(frame::mprpc::ConnectionContext& _rctx) template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, ""); solid_check(!_rerror); @@ -89,19 +89,19 @@ ErrorConditionT start( _rctx.rwait_count += 3; err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(100000, make_string(100000)), + "localhost", frame::mprpc::make_message(100000UL, make_string(100000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; } err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(200000, make_string(200000)), + "localhost", frame::mprpc::make_message(200000UL, make_string(200000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; } err = mprpcclient_ptr->sendMessage( - "localhost", std::make_shared(30000, make_string(30000)), + "localhost", frame::mprpc::make_message(30000UL, make_string(30000)), {frame::mprpc::MessageFlagsE::AwaitResponse}); if (err) { return err; diff --git a/solid/frame/mprpc/test/multiprotocol_basic/gamma/server/gammaserver.hpp b/solid/frame/mprpc/test/multiprotocol_basic/gamma/server/gammaserver.hpp index b534a644..e537aea3 100644 --- a/solid/frame/mprpc/test/multiprotocol_basic/gamma/server/gammaserver.hpp +++ b/solid/frame/mprpc/test/multiprotocol_basic/gamma/server/gammaserver.hpp @@ -10,10 +10,10 @@ namespace gamma_server { template void complete_message( - solid::frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - solid::ErrorConditionT const& _rerror) + solid::frame::mprpc::ConnectionContext& _rctx, + solid::frame::mprpc::MessagePointerT& _rsent_msg_ptr, + solid::frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + solid::ErrorConditionT const& _rerror) { solid_dbg(solid::generic_logger, Info, ""); solid_check(!_rerror); diff --git a/solid/frame/mprpc/test/test_clientfrontback_download.cpp b/solid/frame/mprpc/test/test_clientfrontback_download.cpp index 44c540fc..cfb87e38 100644 --- a/solid/frame/mprpc/test/test_clientfrontback_download.cpp +++ b/solid/frame/mprpc/test/test_clientfrontback_download.cpp @@ -80,11 +80,11 @@ struct Request : frame::mprpc::Message { }; struct Response : frame::mprpc::Message { - uint32_t error_; - ostringstream oss_; - mutable istringstream iss_; - std::shared_ptr req_ptr_; - frame::mprpc::RecipientId recipient_id_; + uint32_t error_; + ostringstream oss_; + mutable istringstream iss_; + frame::mprpc::MessagePointerT req_ptr_; + frame::mprpc::RecipientId recipient_id_; Response() : error_(0) @@ -124,21 +124,24 @@ struct Response : frame::mprpc::Message { } }; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; + Request::Request(Response& _res) : frame::mprpc::Message(_res) { } void on_server_receive_first_request( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror); + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror); void on_server_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "front: on message: " << _rsent_msg_ptr.get()); @@ -146,8 +149,8 @@ void on_server_response( void on_client_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "front: on message"); @@ -155,8 +158,8 @@ void on_client_request( void on_client_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "front: on message"); @@ -164,8 +167,8 @@ void on_client_response( void on_client_receive_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); } // namespace front @@ -175,10 +178,10 @@ namespace back { struct Response; struct Request : frame::mprpc::Message { - string name_; - std::shared_ptr res_ptr_; - frame::mprpc::RecipientId recipient_id_; - bool await_response_; + string name_; + frame::mprpc::MessagePointerT res_ptr_; + frame::mprpc::RecipientId recipient_id_; + bool await_response_; Request() { @@ -239,6 +242,9 @@ struct Response : frame::mprpc::Message { } }; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; + Request::Request(Response& _res) : frame::mprpc::Message(_res) { @@ -246,14 +252,14 @@ Request::Request(Response& _res) void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: on message"); @@ -261,8 +267,8 @@ void on_server_response( void on_client_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: on message"); @@ -270,8 +276,8 @@ void on_client_request( void on_client_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: on message"); @@ -517,7 +523,7 @@ int test_clientfrontback_download(int argc, char* argv[]) expect_count = file_vec.size(); for (const auto& f : file_vec) { - auto msg_ptr = make_shared(f); + auto msg_ptr = frame::mprpc::make_message(f); msg_ptr->ofs_.open(string("client_storage/") + f); mprpc_front_client.sendRequest("localhost", msg_ptr, front::on_client_receive_response); @@ -630,10 +636,10 @@ void check_files(const vector& _file_vec, const char* _path_prefix_clien namespace back { void on_client_receive_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror); + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror); } // namespace back @@ -645,8 +651,8 @@ namespace front { void on_client_receive_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -663,7 +669,7 @@ void on_client_receive_response( if (!_rrecv_msg_ptr->isResponseLast()) { if (_rsent_msg_ptr->send_request_) { _rsent_msg_ptr->send_request_ = false; - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); auto err = _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, {frame::mprpc::MessageFlagsE::Response}); solid_log(logger, Verbose, "send response to: " << _rctx.recipientId() << " err: " << err.message()); } else { @@ -682,10 +688,10 @@ void on_client_receive_response( //----------------------------------------------------------------------------- void on_server_receive_request( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); solid_check(_rrecv_msg_ptr->name_.empty()); @@ -698,21 +704,21 @@ void on_server_receive_request( } void on_server_receive_first_request( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); solid_log(logger, Verbose, "front: received first request for file: " << _rrecv_msg_ptr->name_); - auto req_ptr = make_shared(); + auto req_ptr = frame::mprpc::make_message(); frame::mprpc::MessageFlagsT flags; req_ptr->name_ = std::move(_rrecv_msg_ptr->name_); req_ptr->recipient_id_ = _rctx.recipientId(); - req_ptr->res_ptr_ = make_shared(*_rrecv_msg_ptr); + req_ptr->res_ptr_ = frame::mprpc::make_message(*_rrecv_msg_ptr); req_ptr->await_response_ = true; pmprpc_back_client->sendRequest("localhost", req_ptr, back::on_client_receive_response, flags); @@ -723,14 +729,14 @@ void on_server_receive_first_request( namespace back { void on_client_receive_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: received response for: " << _rsent_msg_ptr->name_); - std::shared_ptr res_ptr = make_shared(); + frame::mprpc::MessagePointerT res_ptr = frame::mprpc::make_message(); res_ptr->error_ = _rrecv_msg_ptr->error_; res_ptr->iss_.str(_rrecv_msg_ptr->oss_.str()); @@ -745,7 +751,7 @@ void on_client_receive_response( frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::AwaitResponse, frame::mprpc::MessageFlagsE::ResponsePart}; _rsent_msg_ptr->await_response_ = false; res_ptr->recipient_id_ = _rctx.recipientId(); - res_ptr->req_ptr_ = make_shared(*_rrecv_msg_ptr); + res_ptr->req_ptr_ = frame::mprpc::make_message(*_rrecv_msg_ptr); solid_log(logger, Verbose, "back: sent response part to front with wait: " << res_ptr.get()); pmprpc_front_server->sendMessage(_rsent_msg_ptr->recipient_id_, res_ptr, front::on_server_receive_request, flags); } else { @@ -762,8 +768,8 @@ void on_client_receive_response( //----------------------------------------------------------------------------- void on_server_receive_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -783,13 +789,13 @@ void on_server_receive_request( void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { string path = string("server_storage") + '/' + _rrecv_msg_ptr->name_; - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->ifs_.open(path); diff --git a/solid/frame/mprpc/test/test_clientfrontback_upload.cpp b/solid/frame/mprpc/test/test_clientfrontback_upload.cpp index 5614d1b7..bb641686 100644 --- a/solid/frame/mprpc/test/test_clientfrontback_upload.cpp +++ b/solid/frame/mprpc/test/test_clientfrontback_upload.cpp @@ -93,9 +93,9 @@ struct Request : frame::mprpc::Message { }; struct Response : frame::mprpc::Message { - uint32_t error_; - frame::mprpc::RecipientId recipient_id_; - shared_ptr req_ptr_; + uint32_t error_; + frame::mprpc::RecipientId recipient_id_; + frame::mprpc::MessagePointerT req_ptr_; Response() { @@ -116,16 +116,19 @@ struct Response : frame::mprpc::Message { } }; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; + void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "front: on message"); @@ -133,8 +136,8 @@ void on_server_response( void on_client_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "front: on message"); @@ -142,8 +145,8 @@ void on_client_request( void on_client_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "front: on message"); @@ -151,8 +154,8 @@ void on_client_response( void on_client_receive_first_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); } // namespace front @@ -160,12 +163,12 @@ void on_client_receive_first_response( namespace back { struct Request : frame::mprpc::Message { - string name_; - mutable istringstream iss_; - ofstream ofs_; - ostringstream oss_; - frame::mprpc::RecipientId recipient_id_; - shared_ptr res_ptr_; + string name_; + mutable istringstream iss_; + ofstream ofs_; + ostringstream oss_; + frame::mprpc::RecipientId recipient_id_; + frame::mprpc::MessagePointerT res_ptr_; Request() { @@ -203,10 +206,12 @@ struct Request : frame::mprpc::Message { } }; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; + struct Response : frame::mprpc::Message { - uint32_t error_; - std::shared_ptr req_ptr_; - bool send_response_; + uint32_t error_; + RequestPointerT req_ptr_; + bool send_response_; Response() { @@ -217,7 +222,7 @@ struct Response : frame::mprpc::Message { { } - Response(std::shared_ptr&& _req_ptr) + Response(RequestPointerT&& _req_ptr) : frame::mprpc::Message(*_req_ptr) , req_ptr_(std::move(_req_ptr)) @@ -235,16 +240,18 @@ struct Response : frame::mprpc::Message { } }; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; + void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: on message"); @@ -252,8 +259,8 @@ void on_server_response( void on_client_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: on message"); @@ -261,8 +268,8 @@ void on_client_request( void on_client_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: on message"); @@ -507,7 +514,7 @@ int test_clientfrontback_upload(int argc, char* argv[]) expect_count = file_vec.size(); for (const auto& f : file_vec) { - auto msg_ptr = make_shared(f); + auto msg_ptr = frame::mprpc::make_message(f); msg_ptr->ifs_.open(string("client_storage/") + f); mprpc_front_client.sendRequest("localhost", msg_ptr, front::on_client_receive_first_response); @@ -620,16 +627,16 @@ void check_files(const vector& _file_vec, const char* _path_prefix_clien namespace back { void on_client_receive_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror); + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror); void on_client_receive_first_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror); + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror); } // namespace back namespace front { @@ -640,8 +647,8 @@ namespace front { void on_client_receive_last_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -654,8 +661,8 @@ void on_client_receive_last_response( void on_client_receive_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -677,8 +684,8 @@ void on_client_receive_response( void on_client_receive_first_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -706,15 +713,15 @@ void on_client_receive_first_response( //----------------------------------------------------------------------------- void on_server_receive_request( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "front: received request for: " << _rsent_msg_ptr->req_ptr_->name_); if (!_rrecv_msg_ptr->isResponseLast()) { - std::shared_ptr req_ptr = make_shared(); + frame::mprpc::MessagePointerT req_ptr = frame::mprpc::make_message(); req_ptr->header(_rsent_msg_ptr->req_ptr_->header()); req_ptr->iss_.str(_rrecv_msg_ptr->oss_.str()); @@ -728,14 +735,14 @@ void on_server_receive_request( } else { frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::ResponsePart}; pmprpc_back_client->sendMessage(_rsent_msg_ptr->recipient_id_, req_ptr, flags); - _rsent_msg_ptr->req_ptr_->res_ptr_ = make_shared(); + _rsent_msg_ptr->req_ptr_->res_ptr_ = frame::mprpc::make_message(); solid_log(logger, Verbose, "front: forward request without wait response"); } } else { solid_check(_rsent_msg_ptr->req_ptr_->res_ptr_); - frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::AwaitResponse, frame::mprpc::MessageFlagsE::ResponseLast}; - std::shared_ptr req_ptr = std::move(_rsent_msg_ptr->req_ptr_); + frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::AwaitResponse, frame::mprpc::MessageFlagsE::ResponseLast}; + frame::mprpc::MessagePointerT req_ptr = std::move(_rsent_msg_ptr->req_ptr_); req_ptr->res_ptr_->header(_rrecv_msg_ptr->header()); req_ptr->recipient_id_ = _rctx.recipientId(); pmprpc_back_client->sendMessage(_rsent_msg_ptr->recipient_id_, req_ptr, back::on_client_receive_response, flags); @@ -745,22 +752,22 @@ void on_server_receive_request( // front server upload entry point - called only once at the begining of every file upload void on_server_receive_first_request( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); solid_log(logger, Verbose, "front: received first request for file: " << _rrecv_msg_ptr->name_); - auto req_ptr = make_shared(); + auto req_ptr = frame::mprpc::make_message(); frame::mprpc::MessageFlagsT flags; req_ptr->name_ = std::move(_rrecv_msg_ptr->name_); req_ptr->iss_.str(_rrecv_msg_ptr->oss_.str()); req_ptr->recipient_id_ = _rctx.recipientId(); - req_ptr->res_ptr_ = make_shared(*_rrecv_msg_ptr); + req_ptr->res_ptr_ = frame::mprpc::make_message(*_rrecv_msg_ptr); pmprpc_back_client->sendRequest("localhost", req_ptr, back::on_client_receive_first_response, flags); } @@ -770,15 +777,15 @@ void on_server_receive_first_request( namespace back { void on_client_receive_first_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: received response on back client for: " << _rsent_msg_ptr->name_); - std::shared_ptr res_ptr = std::move(_rsent_msg_ptr->res_ptr_); - frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::AwaitResponse, frame::mprpc::MessageFlagsE::Response}; - _rsent_msg_ptr->res_ptr_ = make_shared(); + frame::mprpc::MessagePointerT res_ptr = std::move(_rsent_msg_ptr->res_ptr_); + frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::AwaitResponse, frame::mprpc::MessageFlagsE::Response}; + _rsent_msg_ptr->res_ptr_ = frame::mprpc::make_message(); res_ptr->error_ = _rrecv_msg_ptr->error_; res_ptr->recipient_id_ = _rctx.recipientId(); res_ptr->req_ptr_ = std::move(_rsent_msg_ptr); @@ -789,14 +796,14 @@ void on_client_receive_first_response( } void on_client_receive_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "back: received response on back client for: " << _rsent_msg_ptr->name_); - std::shared_ptr res_ptr = std::move(_rsent_msg_ptr->res_ptr_); - frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::Response}; + frame::mprpc::MessagePointerT res_ptr = std::move(_rsent_msg_ptr->res_ptr_); + frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::Response}; res_ptr->error_ = _rrecv_msg_ptr->error_; res_ptr->recipient_id_ = _rctx.recipientId(); res_ptr->req_ptr_ = std::move(_rsent_msg_ptr); @@ -811,8 +818,8 @@ void on_client_receive_response( //----------------------------------------------------------------------------- void on_server_receive_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { // the server will keep receiving new Requests @@ -826,7 +833,7 @@ void on_server_receive_request( if (!_rrecv_msg_ptr->isResponseLast()) { if (_rsent_msg_ptr->send_response_) { _rsent_msg_ptr->send_response_ = false; - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->error_ = 0; auto err = _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, {frame::mprpc::MessageFlagsE::Response}); solid_log(logger, Verbose, "back: send response to: " << _rctx.recipientId() << " err: " << err.message()); @@ -835,7 +842,7 @@ void on_server_receive_request( } } else { _rsent_msg_ptr->req_ptr_->ofs_.flush(); - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->error_ = 0; auto err = _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, {frame::mprpc::MessageFlagsE::Response}); solid_log(logger, Verbose, "back: send last response to: " << _rctx.recipientId() << " err: " << err.message()); @@ -844,8 +851,8 @@ void on_server_receive_request( void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { string path = string("server_storage") + '/' + _rrecv_msg_ptr->name_; @@ -854,7 +861,7 @@ void on_server_receive_first_request( string s = _rrecv_msg_ptr->oss_.str(); solid_log(logger, Verbose, "back: receiving file: " << path << " data size: " << s.size() << " ptr: " << _rrecv_msg_ptr.get()); _rrecv_msg_ptr->ofs_.write(s.data(), s.size()); - auto res_ptr = make_shared(std::move(_rrecv_msg_ptr)); + auto res_ptr = frame::mprpc::make_message(std::move(_rrecv_msg_ptr)); res_ptr->error_ = 0; const frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::AwaitResponse, frame::mprpc::MessageFlagsE::Response}; _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, on_server_receive_request, flags); diff --git a/solid/frame/mprpc/test/test_clientserver_basic.cpp b/solid/frame/mprpc/test/test_clientserver_basic.cpp index 6866faff..d9a15271 100644 --- a/solid/frame/mprpc/test/test_clientserver_basic.cpp +++ b/solid/frame/mprpc/test/test_clientserver_basic.cpp @@ -153,6 +153,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -186,7 +188,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " " << crtbackidx << " " << writecount); @@ -221,7 +223,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { if (_rrecv_msg_ptr) { @@ -247,7 +249,7 @@ void server_complete_message( solid_dbg(generic_logger, Info, crtreadidx); if (crtwriteidx < writecount) { err = pmprpcclient->sendMessage( - "", std::make_shared(crtwriteidx++), + "", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); solid_check(!err, "Connection id should not be invalid! " << err.message()); } @@ -422,7 +424,7 @@ int test_clientserver_basic(int argc, char* argv[]) for (; crtwriteidx < start_count;) { mprpcclient.sendMessage( - "", std::make_shared(crtwriteidx++), + "", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); } diff --git a/solid/frame/mprpc/test/test_clientserver_cancel_client.cpp b/solid/frame/mprpc/test/test_clientserver_cancel_client.cpp index 3cbca841..c23fc64d 100644 --- a/solid/frame/mprpc/test/test_clientserver_cancel_client.cpp +++ b/solid/frame/mprpc/test/test_clientserver_cancel_client.cpp @@ -167,6 +167,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -190,7 +192,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) solid_dbg(generic_logger, Info, _rctx.recipientId()); } -void client_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ptr& _rmsgptr) +void client_receive_message(frame::mprpc::ConnectionContext& _rctx, MessagePointerT& _rmsgptr) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -200,7 +202,7 @@ void client_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& /*_rsent_msg_ptr*/, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& /*_rsent_msg_ptr*/, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error = " << _rerror.message()); @@ -209,7 +211,7 @@ void client_complete_message( } } -void server_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ptr& _rmsgptr) +void server_receive_message(frame::mprpc::ConnectionContext& _rctx, MessagePointerT& _rmsgptr) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " message id on sender " << _rmsgptr->senderRequestId()); @@ -253,7 +255,7 @@ void server_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& /*_rsent_msg_ptr*/, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& /*_rsent_msg_ptr*/, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -405,7 +407,7 @@ int test_clientserver_cancel_client(int argc, char* argv[]) frame::mprpc::MessageId msguid; ErrorConditionT err = mprpcclient.sendMessage( - "localhost", frame::mprpc::MessagePointerT(std::make_shared(crtwriteidx)), + "localhost", frame::mprpc::MessagePointerT<>(frame::mprpc::make_message(crtwriteidx)), recipient_id, msguid); diff --git a/solid/frame/mprpc/test/test_clientserver_cancel_server.cpp b/solid/frame/mprpc/test/test_clientserver_cancel_server.cpp index a6cb8e36..3a8f2f50 100644 --- a/solid/frame/mprpc/test/test_clientserver_cancel_server.cpp +++ b/solid/frame/mprpc/test/test_clientserver_cancel_server.cpp @@ -162,6 +162,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -185,7 +187,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) solid_dbg(generic_logger, Info, _rctx.recipientId()); } -void client_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ptr& _rmsgptr) +void client_receive_message(frame::mprpc::ConnectionContext& _rctx, MessagePointerT& _rmsgptr) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -218,7 +220,7 @@ void client_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -235,7 +237,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& /*_rsent_msg_ptr*/, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& /*_rsent_msg_ptr*/, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -261,7 +263,7 @@ void server_complete_message( frame::mprpc::MessageId msguid; ErrorConditionT err = _rctx.service().sendMessage( - recipient_id, frame::mprpc::MessagePointerT(std::make_shared(crtwriteidx)), + recipient_id, frame::mprpc::MessagePointerT<>(frame::mprpc::make_message(crtwriteidx)), msguid); solid_check(!err, "Connection id should not be invalid! " << err.message()); @@ -412,7 +414,7 @@ int test_clientserver_cancel_server(int argc, char* argv[]) { // Step 1. - frame::mprpc::MessagePointerT msgptr(std::make_shared(0)); + auto msgptr(frame::mprpc::make_message(0)); mprpcclient.sendMessage( "localhost", msgptr, initarray[0].flags); diff --git a/solid/frame/mprpc/test/test_clientserver_delayed.cpp b/solid/frame/mprpc/test/test_clientserver_delayed.cpp index 2bfe5ce2..66b1fb80 100644 --- a/solid/frame/mprpc/test/test_clientserver_delayed.cpp +++ b/solid/frame/mprpc/test/test_clientserver_delayed.cpp @@ -150,6 +150,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -175,7 +177,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -227,7 +229,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { if (_rrecv_msg_ptr) { @@ -355,14 +357,14 @@ int test_clientserver_delayed(int argc, char* argv[]) } } { - frame::mprpc::MessagePointerT msgptr(std::make_shared(0)); + MessagePointerT msgptr(frame::mprpc::make_message(0)); err = mprpcclient.sendMessage( "localhost", msgptr); ++writecount; } { - frame::mprpc::MessagePointerT msgptr(std::make_shared(1)); + MessagePointerT msgptr(frame::mprpc::make_message(1)); err = mprpcclient.sendMessage( "localhost", msgptr, {frame::mprpc::MessageFlagsE::OneShotSend}); //++writecount; @@ -370,7 +372,7 @@ int test_clientserver_delayed(int argc, char* argv[]) } { - frame::mprpc::MessagePointerT msgptr(std::make_shared(2)); + MessagePointerT msgptr(frame::mprpc::make_message(2)); err = mprpcclient.sendMessage( "localhost", msgptr, {frame::mprpc::MessageFlagsE::AwaitResponse}); ++writecount; diff --git a/solid/frame/mprpc/test/test_clientserver_download.cpp b/solid/frame/mprpc/test/test_clientserver_download.cpp index 1e20a8f5..f093f245 100644 --- a/solid/frame/mprpc/test/test_clientserver_download.cpp +++ b/solid/frame/mprpc/test/test_clientserver_download.cpp @@ -119,6 +119,9 @@ struct Response : frame::mprpc::Message { } }; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; + Request::Request(Response& _rmsg) : frame::mprpc::Message(_rmsg) , send_request_(true) @@ -127,8 +130,8 @@ Request::Request(Response& _rmsg) void on_client_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -136,8 +139,8 @@ void on_client_request( void on_client_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -145,20 +148,20 @@ void on_client_response( void on_client_receive_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -317,7 +320,7 @@ int test_clientserver_download(int argc, char* argv[]) expect_count = file_vec.size(); for (const auto& f : file_vec) { - auto msg_ptr = make_shared(f); + auto msg_ptr = frame::mprpc::make_message(f); msg_ptr->ofs_.open(string("client_storage/") + f); mprpc_client.sendRequest("localhost", msg_ptr, on_client_receive_response); @@ -432,8 +435,8 @@ void check_files(const vector& _file_vec, const char* _path_prefix_clien void on_client_receive_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -450,7 +453,7 @@ void on_client_receive_response( if (!_rrecv_msg_ptr->isResponseLast()) { if (_rsent_msg_ptr->send_request_) { _rsent_msg_ptr->send_request_ = false; - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); auto err = _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, {frame::mprpc::MessageFlagsE::Response}); solid_log(logger, Verbose, "send response to: " << _rctx.recipientId() << " err: " << err.message()); } else { @@ -469,8 +472,8 @@ void on_client_receive_response( void on_server_receive_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -490,13 +493,13 @@ void on_server_receive_request( void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { string path = string("server_storage") + '/' + _rrecv_msg_ptr->name_; - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->ifs_.open(path); diff --git a/solid/frame/mprpc/test/test_clientserver_idempotent.cpp b/solid/frame/mprpc/test/test_clientserver_idempotent.cpp index bd61f685..6a7b4009 100644 --- a/solid/frame/mprpc/test/test_clientserver_idempotent.cpp +++ b/solid/frame/mprpc/test/test_clientserver_idempotent.cpp @@ -153,6 +153,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -186,7 +188,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -233,7 +235,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { if (_rrecv_msg_ptr) { @@ -407,12 +409,12 @@ int test_clientserver_idempotent(int argc, char* argv[]) pmprpcclient = &mprpcclient; - std::vector> msg_vec{ - std::make_shared(0), - std::make_shared(1), - std::make_shared(2), - std::make_shared(3), - std::make_shared(4)}; + std::vector msg_vec{ + frame::mprpc::make_message(0), + frame::mprpc::make_message(1), + frame::mprpc::make_message(2), + frame::mprpc::make_message(3), + frame::mprpc::make_message(4)}; { ++crtwriteidx; mprpcclient.sendMessage( diff --git a/solid/frame/mprpc/test/test_clientserver_noserver.cpp b/solid/frame/mprpc/test/test_clientserver_noserver.cpp index 572c60f4..4c16ef74 100644 --- a/solid/frame/mprpc/test/test_clientserver_noserver.cpp +++ b/solid/frame/mprpc/test/test_clientserver_noserver.cpp @@ -137,6 +137,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -152,7 +154,7 @@ void client_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -266,7 +268,7 @@ int test_clientserver_noserver(int argc, char* argv[]) frame::mprpc::RecipientId recipient_id; frame::mprpc::MessageId message_id; { - frame::mprpc::MessagePointerT msgptr(std::make_shared(0)); + MessagePointerT msgptr(frame::mprpc::make_message(0)); err = mprpcclient.sendMessage( "localhost", msgptr, diff --git a/solid/frame/mprpc/test/test_clientserver_oneshot.cpp b/solid/frame/mprpc/test/test_clientserver_oneshot.cpp index a4ff0bc5..2cbeb869 100644 --- a/solid/frame/mprpc/test/test_clientserver_oneshot.cpp +++ b/solid/frame/mprpc/test/test_clientserver_oneshot.cpp @@ -136,6 +136,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -152,7 +154,7 @@ void client_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " " << _rerror.message()); @@ -267,7 +269,7 @@ int test_clientserver_oneshot(int argc, char* argv[]) frame::mprpc::RecipientId recipient_id; frame::mprpc::MessageId message_id; { - frame::mprpc::MessagePointerT msgptr(std::make_shared(0)); + MessagePointerT msgptr(frame::mprpc::make_message(0)); err = mprpcclient.sendMessage( "localhost", msgptr, diff --git a/solid/frame/mprpc/test/test_clientserver_sendrequest.cpp b/solid/frame/mprpc/test/test_clientserver_sendrequest.cpp index ba503e00..3e25c092 100644 --- a/solid/frame/mprpc/test/test_clientserver_sendrequest.cpp +++ b/solid/frame/mprpc/test/test_clientserver_sendrequest.cpp @@ -167,6 +167,9 @@ struct Response : frame::mprpc::Message { } }; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -198,15 +201,15 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) _rctx.service().connectionNotifyEnterActiveState(_rctx.recipientId(), lambda); } -// void client_receive_request(frame::mprpc::ConnectionContext &_rctx, std::shared_ptr &_rmsgptr){ +// void client_receive_request(frame::mprpc::ConnectionContext &_rctx, RequestPointerT &_rmsgptr){ // solid_dbg(generic_logger, Info, _rctx.recipientId()); // solid_throw("Received request on client."); // } void client_complete_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& /*_rsendmsgptr*/, - std::shared_ptr& /*_rrecvmsgptr*/, + RequestPointerT& /*_rsendmsgptr*/, + ResponsePointerT& /*_rrecvmsgptr*/, ErrorConditionT const& /*_rerr*/) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -215,8 +218,8 @@ void client_complete_request( void client_complete_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& /*_rsendmsgptr*/, - std::shared_ptr& /*_rrecvmsgptr*/, + ResponsePointerT& /*_rsendmsgptr*/, + ResponsePointerT& /*_rrecvmsgptr*/, ErrorConditionT const& /*_rerr*/) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -225,8 +228,8 @@ void client_complete_response( void on_receive_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rreqmsgptr, - std::shared_ptr& _rresmsgptr, + RequestPointerT& _rreqmsgptr, + ResponsePointerT& _rresmsgptr, ErrorConditionT const& /*_rerr*/) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -259,8 +262,8 @@ void on_receive_response( struct ResponseHandler { void operator()( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rreqmsgptr, - std::shared_ptr& _rresmsgptr, + RequestPointerT& _rreqmsgptr, + ResponsePointerT& _rresmsgptr, ErrorConditionT const& _rerr) { on_receive_response(_rctx, _rreqmsgptr, _rresmsgptr, _rerr); @@ -269,8 +272,8 @@ struct ResponseHandler { void server_complete_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsendmsgptr, - std::shared_ptr& _rrecvmsgptr, + RequestPointerT& _rsendmsgptr, + RequestPointerT& _rrecvmsgptr, ErrorConditionT const& _rerr) { if (_rerr) { @@ -299,7 +302,7 @@ void server_complete_request( } // send message back - frame::mprpc::MessagePointerT msgptr(std::make_shared(*_rrecvmsgptr)); + auto msgptr(frame::mprpc::make_message(*_rrecvmsgptr)); _rctx.service().sendResponse(_rctx.recipientId(), msgptr); ++crtreadidx; @@ -307,13 +310,13 @@ void server_complete_request( solid_dbg(generic_logger, Info, crtreadidx); if (crtwriteidx < writecount) { - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + auto msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; pmprpcclient->sendRequest( "localhost", msgptr, // on_receive_response ResponseHandler() - /*[](frame::mprpc::ConnectionContext &_rctx, std::shared_ptr &_rmsgptr, ErrorConditionT const &_rerr)->void{ + /*[](frame::mprpc::ConnectionContext &_rctx, ResponsePointerT &_rmsgptr, ErrorConditionT const &_rerr)->void{ on_receive_response(_rctx, _rmsgptr, _rerr); }*/ , @@ -323,8 +326,8 @@ void server_complete_request( void server_complete_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsendmsgptr, - std::shared_ptr& _rrecvmsgptr, + ResponsePointerT& _rsendmsgptr, + ResponsePointerT& _rrecvmsgptr, ErrorConditionT const& _rerr) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -476,7 +479,7 @@ int test_clientserver_sendrequest(int argc, char* argv[]) writecount = initarraysize; for (; crtwriteidx < start_count;) { - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + auto msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; mprpcclient.sendRequest( "localhost", msgptr, @@ -484,8 +487,8 @@ int test_clientserver_sendrequest(int argc, char* argv[]) // ResponseHandler() []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rreqmsgptr, - std::shared_ptr& _rresmsgptr, + RequestPointerT& _rreqmsgptr, + ResponsePointerT& _rresmsgptr, ErrorConditionT const& _rerr) -> void { on_receive_response(_rctx, _rreqmsgptr, _rresmsgptr, _rerr); }, diff --git a/solid/frame/mprpc/test/test_clientserver_split.cpp b/solid/frame/mprpc/test/test_clientserver_split.cpp index 4a85e95d..6d81a4dd 100644 --- a/solid/frame/mprpc/test/test_clientserver_split.cpp +++ b/solid/frame/mprpc/test/test_clientserver_split.cpp @@ -170,6 +170,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -203,7 +205,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -246,7 +248,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { if (_rrecv_msg_ptr) { @@ -262,7 +264,7 @@ void server_complete_message( for (size_t i = 1; i < _rrecv_msg_ptr->splitCount(); ++i) { err = _rctx.service().sendResponse( - _rctx.recipientId(), std::make_shared(*_rrecv_msg_ptr), + _rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr), {frame::mprpc::MessageFlagsE::ResponsePart}); solid_check(!err, "Connection id should not be invalid: " << err.message()); @@ -281,7 +283,7 @@ void server_complete_message( solid_dbg(generic_logger, Info, crtreadidx); if (crtwriteidx < writecount) { err = pmprpcclient->sendMessage( - "localhost", std::make_shared(crtwriteidx++), + "localhost", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); solid_check(!err, "Connection id should not be invalid! " << err.message()); } @@ -449,7 +451,7 @@ int test_clientserver_split(int argc, char* argv[]) for (; crtwriteidx < start_count;) { mprpcclient.sendMessage( - "localhost", std::make_shared(crtwriteidx++), {frame::mprpc::MessageFlagsE::AwaitResponse}); + "localhost", frame::mprpc::make_message(crtwriteidx++), {frame::mprpc::MessageFlagsE::AwaitResponse}); } unique_lock lock(mtx); diff --git a/solid/frame/mprpc/test/test_clientserver_timeout_secure.cpp b/solid/frame/mprpc/test/test_clientserver_timeout_secure.cpp index 9027f993..7dabe3ba 100644 --- a/solid/frame/mprpc/test/test_clientserver_timeout_secure.cpp +++ b/solid/frame/mprpc/test/test_clientserver_timeout_secure.cpp @@ -96,8 +96,8 @@ void server_connection_stop(frame::mprpc::ConnectionContext& _rctx) } void server_complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { solid_check(false); diff --git a/solid/frame/mprpc/test/test_clientserver_topic.cpp b/solid/frame/mprpc/test/test_clientserver_topic.cpp index 3ddd8402..1a9f6cc9 100644 --- a/solid/frame/mprpc/test/test_clientserver_topic.cpp +++ b/solid/frame/mprpc/test/test_clientserver_topic.cpp @@ -50,7 +50,7 @@ void set_current_thread_affinity() } static std::atomic crtCore(0); - const int isolCore = isolcpus[crtCore.fetch_add(1)]; + const int isolCore = isolcpus[crtCore.fetch_add(1) % isolcpus.size()]; cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(isolCore, &cpuset); @@ -152,8 +152,6 @@ struct Request : frame::mprpc::Message { } }; -using CacheableRequestT = EnableCacheable; - struct Response : frame::mprpc::Message { uint64_t time_point_ = -1; mutable uint64_t serialization_time_point_ = 0; @@ -182,7 +180,12 @@ struct Response : frame::mprpc::Message { } }; -using CacheableResponseT = EnableCacheable; +using CacheableRequestT = EnableCacheable; +using CacheableResponseT = EnableCacheable; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using CesponsePointerT = solid::frame::mprpc::MessagePointerT; +using CacheableRequestPointerT = solid::frame::mprpc::MessagePointerT; +using CacheableResponsePointerT = solid::frame::mprpc::MessagePointerT; template auto lin_value(T _from, T _to, const size_t _index, const size_t _n) @@ -231,22 +234,22 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, CacheableResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void client_complete_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + CacheableResponsePointerT& _rsent_msg_ptr, CacheableResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void server_complete_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + CacheableResponsePointerT& _rsent_msg_ptr, CacheableResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/); void server_complete_request( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + CacheableRequestPointerT& _rsent_msg_ptr, CacheableRequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/); void multicast_run(CallPoolT& _work_pool); @@ -343,7 +346,7 @@ int test_clientserver_topic(int argc, char* argv[]) sch_server.start([]() { set_current_thread_affinity(); for(size_t i = 0; i < 2000; ++i){ - auto reply_ptr = std::make_shared(); + auto reply_ptr = frame::mprpc::make_message(); reply_ptr->cache(); } return true; }, []() {}, 2); @@ -483,7 +486,7 @@ int test_clientserver_topic(int argc, char* argv[]) if (false) { const uint64_t startms = microseconds_since_epoch(); for (size_t i = 0; i < message_count; ++i) { - mprpcclient.sendMessage(client_id, std::make_shared(i, microseconds_since_epoch()), {frame::mprpc::MessageFlagsE::AwaitResponse}); + mprpcclient.sendMessage(client_id, frame::mprpc::make_message(i, microseconds_since_epoch()), {frame::mprpc::MessageFlagsE::AwaitResponse}); } solid_log(logger, Warning, "========== DONE sending messages ========== " << (microseconds_since_epoch() - startms) << "us"); } else { @@ -494,7 +497,7 @@ int test_clientserver_topic(int argc, char* argv[]) for (size_t i = 0; i < message_count; ++i) { this_thread::sleep_until(start + chrono::microseconds(static_cast(lin_value(0.0, stop, i, message_count)))); - mprpcclient.sendMessage(client_id, make_shared(i, microseconds_since_epoch()), {frame::mprpc::MessageFlagsE::AwaitResponse}); + mprpcclient.sendMessage(client_id, frame::mprpc::make_message(i, microseconds_since_epoch()), {frame::mprpc::MessageFlagsE::AwaitResponse}); } solid_log(logger, Warning, "========== DONE sending messages ========== " << (microseconds_since_epoch() - startms) << "us"); } @@ -517,7 +520,7 @@ int test_clientserver_topic(int argc, char* argv[]) worker_pool.stop(); solid_log(logger, Statistic, "Test duration: " << (milliseconds_since_epoch() - start_msec) << "msecs"); - solid_log(logger, Statistic, "Workpool statistic: " << worker_pool.statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << worker_pool.statistic()); solid_log(logger, Statistic, "mprpcserver statistic: " << mprpcserver.statistic()); solid_log(logger, Statistic, "mprpcclient statistic: " << mprpcclient.statistic()); solid_log(logger, Statistic, "req_count: " << req_count.load() << " res_count: " << res_count.load()); @@ -585,8 +588,8 @@ void multicast_run(CallPoolT& _work_pool) #endif } void client_complete_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + CacheableResponsePointerT& _rsent_msg_ptr, CacheableResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(false); // should not be called @@ -594,7 +597,7 @@ void client_complete_response( void client_complete_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, CacheableResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(logger, Info, _rctx.recipientId()); @@ -647,8 +650,8 @@ void client_complete_request( } void server_complete_response( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + CacheableResponsePointerT& _rsent_msg_ptr, CacheableResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { solid_check(_rsent_msg_ptr); @@ -658,8 +661,8 @@ void server_complete_response( } void server_complete_request( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + CacheableRequestPointerT& _rsent_msg_ptr, CacheableRequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { solid_check(_rrecv_msg_ptr); diff --git a/solid/frame/mprpc/test/test_clientserver_upload.cpp b/solid/frame/mprpc/test/test_clientserver_upload.cpp index fb115d67..70092f6f 100644 --- a/solid/frame/mprpc/test/test_clientserver_upload.cpp +++ b/solid/frame/mprpc/test/test_clientserver_upload.cpp @@ -82,11 +82,12 @@ struct Request : frame::mprpc::Message { } } }; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; struct Response : frame::mprpc::Message { - uint32_t error_; - std::shared_ptr req_ptr_; - bool send_response_; + uint32_t error_; + RequestPointerT req_ptr_; + bool send_response_; Response() { @@ -97,7 +98,7 @@ struct Response : frame::mprpc::Message { { } - Response(std::shared_ptr&& _req_ptr) + Response(RequestPointerT&& _req_ptr) : frame::mprpc::Message(*_req_ptr) , req_ptr_(std::move(_req_ptr)) @@ -115,10 +116,12 @@ struct Response : frame::mprpc::Message { } }; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; + void on_client_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -126,8 +129,8 @@ void on_client_request( void on_client_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -135,20 +138,20 @@ void on_client_response( void on_client_receive_first_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -307,7 +310,7 @@ int test_clientserver_upload(int argc, char* argv[]) expect_count = file_vec.size(); for (const auto& f : file_vec) { - auto msg_ptr = make_shared(f); + auto msg_ptr = frame::mprpc::make_message(f); msg_ptr->ifs_.open(string("client_storage/") + f); mprpc_client.sendRequest("localhost", msg_ptr, on_client_receive_first_response); @@ -422,8 +425,8 @@ void check_files(const vector& _file_vec, const char* _path_prefix_clien void on_client_receive_last_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -435,8 +438,8 @@ void on_client_receive_last_response( } void on_client_receive_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -458,8 +461,8 @@ void on_client_receive_response( void on_client_receive_first_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -488,8 +491,8 @@ void on_client_receive_first_response( //----------------------------------------------------------------------------- void on_server_receive_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { // the server will keep receiving new Requests @@ -503,7 +506,7 @@ void on_server_receive_request( if (!_rrecv_msg_ptr->isResponseLast()) { if (_rsent_msg_ptr->send_response_) { _rsent_msg_ptr->send_response_ = false; - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->error_ = 0; auto err = _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, {frame::mprpc::MessageFlagsE::Response}); solid_log(logger, Verbose, "send response to: " << _rctx.recipientId() << " err: " << err.message()); @@ -512,7 +515,7 @@ void on_server_receive_request( } } else { _rsent_msg_ptr->req_ptr_->ofs_.flush(); - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->error_ = 0; auto err = _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, {frame::mprpc::MessageFlagsE::Response}); solid_log(logger, Verbose, "send last response to: " << _rctx.recipientId() << " err: " << err.message()); @@ -521,8 +524,8 @@ void on_server_receive_request( void on_server_receive_first_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { string path = string("server_storage") + '/' + _rrecv_msg_ptr->name_; @@ -531,7 +534,7 @@ void on_server_receive_first_request( string s = _rrecv_msg_ptr->oss_.str(); solid_log(logger, Verbose, "receiving file: " << path << " data size: " << s.size() << " ptr: " << _rrecv_msg_ptr.get()); _rrecv_msg_ptr->ofs_.write(s.data(), s.size()); - auto res_ptr = make_shared(std::move(_rrecv_msg_ptr)); + auto res_ptr = frame::mprpc::make_message(std::move(_rrecv_msg_ptr)); res_ptr->error_ = 0; const frame::mprpc::MessageFlagsT flags{frame::mprpc::MessageFlagsE::AwaitResponse, frame::mprpc::MessageFlagsE::Response}; _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, on_server_receive_request, flags); diff --git a/solid/frame/mprpc/test/test_clientserver_upload_single.cpp b/solid/frame/mprpc/test/test_clientserver_upload_single.cpp index df2c2b54..0db7c365 100644 --- a/solid/frame/mprpc/test/test_clientserver_upload_single.cpp +++ b/solid/frame/mprpc/test/test_clientserver_upload_single.cpp @@ -45,22 +45,22 @@ LoggerT logger("test"); atomic expect_count(0); promise prom; -struct UploadRequest : frame::mprpc::Message { +struct Request : frame::mprpc::Message { string name_; mutable ifstream ifs_; ofstream ofs_; ostringstream oss_; - UploadRequest() + Request() { } - UploadRequest(const string& _name) + Request(const string& _name) : name_(_name) { } - ~UploadRequest() override + ~Request() override { } @@ -87,28 +87,30 @@ struct UploadRequest : frame::mprpc::Message { } }; -struct UploadResponse : frame::mprpc::Message { - uint32_t error_; - std::shared_ptr req_ptr_; - bool send_response_; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; - UploadResponse() +struct Response : frame::mprpc::Message { + uint32_t error_; + RequestPointerT req_ptr_; + bool send_response_; + + Response() { } - UploadResponse(UploadRequest& _req) + Response(Request& _req) : frame::mprpc::Message(_req) { } - UploadResponse(std::shared_ptr&& _req_ptr) + Response(RequestPointerT&& _req_ptr) : frame::mprpc::Message(*_req_ptr) , req_ptr_(std::move(_req_ptr)) , send_response_(false) { } - ~UploadResponse() override + ~Response() override { } @@ -118,10 +120,12 @@ struct UploadResponse : frame::mprpc::Message { } }; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; + void on_client_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -129,8 +133,8 @@ void on_client_request( void on_client_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -138,20 +142,20 @@ void on_client_response( void on_client_first_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_server_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_log(logger, Verbose, "on message"); @@ -235,8 +239,8 @@ int test_clientserver_upload_single(int argc, char* argv[]) auto proto = frame::mprpc::serialization_v3::create_protocol( reflection::v1::metadata::factory, [&](auto& _rmap) { - _rmap.template registerMessage(1, "UploadRequest", on_server_request); - _rmap.template registerMessage(2, "UploadResponse", on_server_response); + _rmap.template registerMessage(1, "Request", on_server_request); + _rmap.template registerMessage(2, "Response", on_server_response); }); frame::mprpc::Configuration cfg(sch_server, proto); @@ -278,8 +282,8 @@ int test_clientserver_upload_single(int argc, char* argv[]) auto proto = frame::mprpc::serialization_v3::create_protocol( reflection::v1::metadata::factory, [&](auto& _rmap) { - _rmap.template registerMessage(1, "UploadRequest", on_client_request); - _rmap.template registerMessage(2, "UploadResponse", on_client_response); + _rmap.template registerMessage(1, "Request", on_client_request); + _rmap.template registerMessage(2, "Response", on_client_response); }); frame::mprpc::Configuration cfg(sch_client, proto); @@ -310,7 +314,7 @@ int test_clientserver_upload_single(int argc, char* argv[]) expect_count = file_vec.size(); for (const auto& f : file_vec) { - auto msg_ptr = make_shared(f); + auto msg_ptr = frame::mprpc::make_message(f); msg_ptr->ifs_.open(string("client_storage/") + f); mprpc_client.sendRequest("localhost", msg_ptr, on_client_first_response); @@ -424,14 +428,14 @@ void check_files(const vector& _file_vec, const char* _path_prefix_clien //----------------------------------------------------------------------------- void on_client_continue_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); void on_client_continue( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { @@ -451,8 +455,8 @@ void on_client_continue( void on_client_continue_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -473,8 +477,8 @@ void on_client_continue_response( void on_client_first_response( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + ResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(_rrecv_msg_ptr); @@ -501,12 +505,12 @@ void on_client_first_response( //----------------------------------------------------------------------------- void on_server_chunk( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + ResponsePointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { - // the server will keep receiving new UploadRequests - // we need to send UploadResponse every other two chunks + // the server will keep receiving new Requests + // we need to send Response every other two chunks solid_check(_rrecv_msg_ptr); std::string s = _rrecv_msg_ptr->oss_.str(); _rsent_msg_ptr->req_ptr_->ofs_.write(s.data(), s.size()); @@ -516,7 +520,7 @@ void on_server_chunk( if (!_rrecv_msg_ptr->isResponseLast()) { if (_rsent_msg_ptr->send_response_) { _rsent_msg_ptr->send_response_ = false; - auto res_ptr = make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->error_ = 0; auto err = _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, {frame::mprpc::MessageFlagsE::Response}); solid_log(logger, Verbose, "send response to: " << _rctx.recipientId() << " err: " << err.message()); @@ -533,8 +537,8 @@ void on_server_chunk( void on_server_request( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& _rsent_msg_ptr, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { string path = string("server_storage") + '/' + _rrecv_msg_ptr->name_; @@ -543,7 +547,7 @@ void on_server_request( string s = _rrecv_msg_ptr->oss_.str(); solid_log(logger, Verbose, "receiving file: " << path << " data size: " << s.size() << " ptr: " << _rrecv_msg_ptr.get()); _rrecv_msg_ptr->ofs_.write(s.data(), s.size()); - auto res_ptr = make_shared(std::move(_rrecv_msg_ptr)); + auto res_ptr = frame::mprpc::make_message(std::move(_rrecv_msg_ptr)); res_ptr->error_ = 0; _rctx.service().sendMessage(_rctx.recipientId(), res_ptr, on_server_chunk, {frame::mprpc::MessageFlagsE::AwaitResponse, frame::mprpc::MessageFlagsE::Response}); } diff --git a/solid/frame/mprpc/test/test_clientserver_versioning.cpp b/solid/frame/mprpc/test/test_clientserver_versioning.cpp index 95435fc1..724f3232 100644 --- a/solid/frame/mprpc/test/test_clientserver_versioning.cpp +++ b/solid/frame/mprpc/test/test_clientserver_versioning.cpp @@ -112,8 +112,8 @@ namespace { template void complete_message( frame::mprpc::ConnectionContext& /*_rctx*/, - std::shared_ptr& /*_rsent_msg_ptr*/, - std::shared_ptr& /*_rrecv_msg_ptr*/, + frame::mprpc::MessagePointerT& /*_rsent_msg_ptr*/, + frame::mprpc::MessagePointerT& /*_rrecv_msg_ptr*/, ErrorConditionT const& /*_rerror*/) { // catch all messages @@ -123,6 +123,11 @@ void complete_message( namespace v1 { using namespace versioning::v1; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; +using InitRequestPointerT = solid::frame::mprpc::MessagePointerT; +using InitResponsePointerT = solid::frame::mprpc::MessagePointerT; + void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, frame::aio::Resolver& _rrsv, const string& _server_port) { auto proto = frame::mprpc::serialization_v3::create_protocol( @@ -140,11 +145,11 @@ void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, fram auto connection_start_lambda = [](frame::mprpc::ConnectionContext& _rctx) { solid_log(logger, Info, "Connection start"); - auto req_ptr = std::make_shared(); + auto req_ptr = frame::mprpc::make_message(); auto lambda = []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + InitRequestPointerT& _rsent_msg_ptr, + InitResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { if (_rrecv_msg_ptr->error_ == 0) { @@ -165,13 +170,13 @@ void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, fram } void send_request(frame::mprpc::ServiceT& _rsvc) { - auto req_ptr = std::make_shared(); + auto req_ptr = frame::mprpc::make_message(); _rsvc.sendRequest( "localhost", req_ptr, []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rreqmsgptr, - std::shared_ptr& _rresmsgptr, + RequestPointerT& _rreqmsgptr, + ResponsePointerT& _rresmsgptr, ErrorConditionT const& _rerr) -> void { solid_check(_rresmsgptr); solid_check(_rresmsgptr->error_ == 10); @@ -189,6 +194,11 @@ void send_request(frame::mprpc::ServiceT& _rsvc) namespace v2 { using namespace versioning::v2; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; +using InitRequestPointerT = solid::frame::mprpc::MessagePointerT; +using InitResponsePointerT = solid::frame::mprpc::MessagePointerT; + void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, frame::aio::Resolver& _rrsv, const string& _server_port) { auto proto = frame::mprpc::serialization_v3::create_protocol( @@ -206,11 +216,11 @@ void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, fram auto connection_start_lambda = [](frame::mprpc::ConnectionContext& _rctx) { solid_log(logger, Info, "Connection start"); - auto req_ptr = std::make_shared(); + auto req_ptr = frame::mprpc::make_message(); auto lambda = []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + InitRequestPointerT& _rsent_msg_ptr, + InitResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { if (_rrecv_msg_ptr->error_ == 0) { @@ -231,14 +241,14 @@ void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, fram } void send_request(frame::mprpc::ServiceT& _rsvc) { - auto req_ptr = std::make_shared(); + auto req_ptr = frame::mprpc::make_message(); req_ptr->value_ = 11; _rsvc.sendRequest( "localhost", req_ptr, []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rreqmsgptr, - std::shared_ptr& _rresmsgptr, + RequestPointerT& _rreqmsgptr, + ResponsePointerT& _rresmsgptr, ErrorConditionT const& _rerr) -> void { solid_check(_rresmsgptr); solid_check(_rresmsgptr->error_ == _rreqmsgptr->value_); @@ -258,6 +268,12 @@ void send_request(frame::mprpc::ServiceT& _rsvc) namespace v3 { using namespace versioning::v3; +using RequestPointerT = solid::frame::mprpc::MessagePointerT; +using ResponsePointerT = solid::frame::mprpc::MessagePointerT; +using Response2PointerT = solid::frame::mprpc::MessagePointerT; +using InitRequestPointerT = solid::frame::mprpc::MessagePointerT; +using InitResponsePointerT = solid::frame::mprpc::MessagePointerT; + void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, frame::aio::Resolver& _rrsv, const string& _server_port) { auto proto = frame::mprpc::serialization_v3::create_protocol( @@ -274,11 +290,11 @@ void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, fram auto connection_start_lambda = [](frame::mprpc::ConnectionContext& _rctx) { solid_log(logger, Info, "Connection start"); - auto req_ptr = std::make_shared(); + auto req_ptr = frame::mprpc::make_message(); auto lambda = []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + InitRequestPointerT& _rsent_msg_ptr, + InitResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { if (_rrecv_msg_ptr->error_ == 0) { @@ -300,14 +316,14 @@ void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, fram } void send_request(frame::mprpc::ServiceT& _rsvc) { - auto req_ptr = std::make_shared(); + auto req_ptr = frame::mprpc::make_message(); req_ptr->values_ = "test"; _rsvc.sendRequest( "localhost", req_ptr, []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rreqmsgptr, - std::shared_ptr& _rresmsgptr, + RequestPointerT& _rreqmsgptr, + Response2PointerT& _rresmsgptr, ErrorConditionT const& _rerr) -> void { solid_check(_rresmsgptr); solid_check(_rresmsgptr->error_ == _rreqmsgptr->values_.size()); @@ -327,6 +343,11 @@ void send_request(frame::mprpc::ServiceT& _rsvc) namespace v4 { using namespace versioning::v4; +using InitRequestPointerT = solid::frame::mprpc::MessagePointerT; +using InitResponsePointerT = solid::frame::mprpc::MessagePointerT; +using Request2PointerT = solid::frame::mprpc::MessagePointerT; +using Response2PointerT = solid::frame::mprpc::MessagePointerT; + void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, frame::aio::Resolver& _rrsv, const string& _server_port) { auto proto = frame::mprpc::serialization_v3::create_protocol( @@ -344,11 +365,11 @@ void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, fram auto connection_start_lambda = [](frame::mprpc::ConnectionContext& _rctx) { solid_log(logger, Info, "Connection start"); - auto req_ptr = std::make_shared(); + auto req_ptr = frame::mprpc::make_message(); auto lambda = []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + InitRequestPointerT& _rsent_msg_ptr, + InitResponsePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { if (_rrecv_msg_ptr->error_ == 0) { @@ -371,13 +392,13 @@ void configure_service(frame::mprpc::ServiceT& _rsvc, AioSchedulerT& _rsch, fram } void send_request(frame::mprpc::ServiceT& _rsvc) { - auto req_ptr = std::make_shared(); + auto req_ptr = frame::mprpc::make_message(); _rsvc.sendRequest( "localhost", req_ptr, []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rreqmsgptr, - std::shared_ptr& _rresmsgptr, + Request2PointerT& _rreqmsgptr, + Response2PointerT& _rresmsgptr, ErrorConditionT const& _rerr) -> void { solid_check(!_rresmsgptr); @@ -399,20 +420,20 @@ using namespace versioning::v3; template void complete_message( frame::mprpc::ConnectionContext& /*_rctx*/, - std::shared_ptr& /*_rsent_msg_ptr*/, - std::shared_ptr& /*_rrecv_msg_ptr*/, + frame::mprpc::MessagePointerT& /*_rsent_msg_ptr*/, + frame::mprpc::MessagePointerT& /*_rrecv_msg_ptr*/, ErrorConditionT const& /*_rerror*/); template <> void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& /*_rsent_msg_ptr*/, - std::shared_ptr& _rrecv_msg_ptr, + InitRequestPointerT& /*_rsent_msg_ptr*/, + InitRequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { solid_log(logger, Info, "Init request: peer [" << _rrecv_msg_ptr->version_.version_ << ']'); - auto res_ptr = std::make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); _rctx.any() = std::make_tuple(_rrecv_msg_ptr->version_); @@ -436,22 +457,22 @@ void complete_message( template <> void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& /*_rsent_msg_ptr*/, - std::shared_ptr& _rrecv_msg_ptr, + RequestPointerT& /*_rsent_msg_ptr*/, + RequestPointerT& _rrecv_msg_ptr, ErrorConditionT const& /*_rerror*/) { if (_rctx.any().get_if()->version_ == 2) { // need to send back Response2 - auto res_ptr = std::make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->error_ = _rrecv_msg_ptr->values_.size(); _rctx.service().sendResponse(_rctx.recipientId(), res_ptr); } else if (_rctx.any().get_if()->request_ == 1) { - auto res_ptr = std::make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->error_ = 10; _rctx.service().sendResponse(_rctx.recipientId(), res_ptr); } else if (_rctx.any().get_if()->request_ == 2) { - auto res_ptr = std::make_shared(*_rrecv_msg_ptr); + auto res_ptr = frame::mprpc::make_message(*_rrecv_msg_ptr); res_ptr->error_ = _rrecv_msg_ptr->valuei_; _rctx.service().sendResponse(_rctx.recipientId(), res_ptr); } @@ -460,8 +481,8 @@ void complete_message( template void complete_message( frame::mprpc::ConnectionContext& /*_rctx*/, - std::shared_ptr& /*_rsent_msg_ptr*/, - std::shared_ptr& /*_rrecv_msg_ptr*/, + frame::mprpc::MessagePointerT& /*_rsent_msg_ptr*/, + frame::mprpc::MessagePointerT& /*_rrecv_msg_ptr*/, ErrorConditionT const& /*_rerror*/) { // catch all diff --git a/solid/frame/mprpc/test/test_connection_close.cpp b/solid/frame/mprpc/test/test_connection_close.cpp index 2b597193..430eaf60 100644 --- a/solid/frame/mprpc/test/test_connection_close.cpp +++ b/solid/frame/mprpc/test/test_connection_close.cpp @@ -132,6 +132,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + struct Logout : frame::mprpc::Message { SOLID_REFLECT_V1(_rr, _rthis, _rctx) { @@ -178,7 +180,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -200,7 +202,7 @@ void client_complete_message( } { - frame::mprpc::MessagePointerT msgptr(std::make_shared()); + auto msgptr(frame::mprpc::make_message()); pmprpcclient->sendMessage( _rctx.recipientId(), msgptr, @@ -212,8 +214,8 @@ void client_complete_message( } void client_complete_logout( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); @@ -224,7 +226,7 @@ void client_complete_logout( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr.get()) { @@ -252,8 +254,8 @@ void server_complete_message( } void server_complete_logout( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr.get()) { @@ -381,7 +383,7 @@ int test_connection_close(int argc, char* argv[]) pmprpcclient = &mprpcclient; { - frame::mprpc::MessagePointerT msgptr(std::make_shared(0)); + MessagePointerT msgptr(frame::mprpc::make_message(0)); mprpcclient.sendMessage( "localhost", msgptr, initarray[0].flags | frame::mprpc::MessageFlagsE::AwaitResponse); diff --git a/solid/frame/mprpc/test/test_keepalive_fail.cpp b/solid/frame/mprpc/test/test_keepalive_fail.cpp index b06c3577..d9ccf1e1 100644 --- a/solid/frame/mprpc/test/test_keepalive_fail.cpp +++ b/solid/frame/mprpc/test/test_keepalive_fail.cpp @@ -147,6 +147,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -190,7 +192,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) solid_dbg(generic_logger, Info, _rctx.recipientId()); } -void client_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ptr& _rmsgptr) +void client_receive_message(frame::mprpc::ConnectionContext& _rctx, MessagePointerT& _rmsgptr) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -217,7 +219,7 @@ void client_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -232,7 +234,7 @@ void client_complete_message( } } -void server_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ptr& _rmsgptr) +void server_receive_message(frame::mprpc::ConnectionContext& _rctx, MessagePointerT& _rmsgptr) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " message id on sender " << _rmsgptr->senderRequestId()); if (!_rmsgptr->check()) { @@ -249,7 +251,7 @@ void server_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ ++crtreadidx; solid_dbg(generic_logger, Info, crtreadidx); if (crtwriteidx < writecount) { - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + MessagePointerT msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; pmprpcclient->sendMessage( "localhost", msgptr, @@ -259,7 +261,7 @@ void server_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -386,7 +388,7 @@ int test_keepalive_fail(int argc, char* argv[]) writecount = 1; { - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + MessagePointerT msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; mprpcclient.sendMessage( "localhost", msgptr, diff --git a/solid/frame/mprpc/test/test_keepalive_success.cpp b/solid/frame/mprpc/test/test_keepalive_success.cpp index cec0fddf..7e61a60c 100644 --- a/solid/frame/mprpc/test/test_keepalive_success.cpp +++ b/solid/frame/mprpc/test/test_keepalive_success.cpp @@ -146,6 +146,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -169,7 +171,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) solid_dbg(generic_logger, Info, _rctx.recipientId()); } -void client_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ptr& _rmsgptr) +void client_receive_message(frame::mprpc::ConnectionContext& _rctx, MessagePointerT& _rmsgptr) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -197,7 +199,7 @@ void client_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -212,7 +214,7 @@ void client_complete_message( } } -void server_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ptr& _rmsgptr) +void server_receive_message(frame::mprpc::ConnectionContext& _rctx, MessagePointerT& _rmsgptr) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " message id on sender " << _rmsgptr->senderRequestId()); if (!_rmsgptr->check()) { @@ -229,7 +231,7 @@ void server_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ ++crtreadidx; solid_dbg(generic_logger, Info, crtreadidx); if(crtwriteidx < writecount){ - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + MessagePointerT msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; pmprpcclient->sendMessage( "localhost:6666", msgptr, @@ -240,7 +242,7 @@ void server_receive_message(frame::mprpc::ConnectionContext& _rctx, std::shared_ void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -362,7 +364,7 @@ int test_keepalive_success(int argc, char* argv[]) writecount = 2; { - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + MessagePointerT msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; mprpcclient.sendMessage( "localhost", msgptr, @@ -374,7 +376,7 @@ int test_keepalive_success(int argc, char* argv[]) solid_dbg(generic_logger, Info, "after sleep"); { - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + MessagePointerT msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; mprpcclient.sendMessage( "localhost", msgptr, diff --git a/solid/frame/mprpc/test/test_pool_basic.cpp b/solid/frame/mprpc/test/test_pool_basic.cpp index 4a225ae3..cc5a63fe 100644 --- a/solid/frame/mprpc/test/test_pool_basic.cpp +++ b/solid/frame/mprpc/test/test_pool_basic.cpp @@ -152,6 +152,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -185,7 +187,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -220,7 +222,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -246,7 +248,7 @@ void server_complete_message( solid_dbg(generic_logger, Info, crtreadidx); if (crtwriteidx < writecount) { err = pmprpcclient->sendMessage( - client_id, std::make_shared(crtwriteidx++), + client_id, frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); solid_check(!err, "Connection id should not be invalid! " << err.message()); } @@ -420,7 +422,7 @@ int test_pool_basic(int argc, char* argv[]) for (; crtwriteidx < start_count;) { mprpcclient.sendMessage( - client_id, std::make_shared(crtwriteidx++), + client_id, frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); } diff --git a/solid/frame/mprpc/test/test_pool_delay_close.cpp b/solid/frame/mprpc/test/test_pool_delay_close.cpp index 67021884..20c99ca9 100644 --- a/solid/frame/mprpc/test/test_pool_delay_close.cpp +++ b/solid/frame/mprpc/test/test_pool_delay_close.cpp @@ -150,6 +150,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -175,7 +177,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -216,7 +218,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr.get()) { @@ -354,14 +356,14 @@ int test_pool_delay_close(int argc, char* argv[]) writecount = start_count; // { - std::vector msg_vec; + std::vector msg_vec; for (size_t i = 0; i < start_count; ++i) { - msg_vec.push_back(frame::mprpc::MessagePointerT(std::make_shared(i))); + msg_vec.push_back(MessagePointerT(frame::mprpc::make_message(i))); } { - std::vector::iterator it = msg_vec.begin(); + std::vector::iterator it = msg_vec.begin(); { ++crtwriteidx; @@ -397,8 +399,8 @@ int test_pool_delay_close(int argc, char* argv[]) }); { - frame::mprpc::MessagePointerT msgptr(std::make_shared(0)); - ErrorConditionT err = pmprpcclient->sendMessage( + MessagePointerT msgptr(frame::mprpc::make_message(0)); + ErrorConditionT err = pmprpcclient->sendMessage( recipinet_id, msgptr, {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_dbg(generic_logger, Info, "send message error message: " << err.message()); diff --git a/solid/frame/mprpc/test/test_pool_force_close.cpp b/solid/frame/mprpc/test/test_pool_force_close.cpp index 9892dd6d..fae1450b 100644 --- a/solid/frame/mprpc/test/test_pool_force_close.cpp +++ b/solid/frame/mprpc/test/test_pool_force_close.cpp @@ -167,6 +167,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -192,7 +194,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -206,7 +208,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(false); @@ -323,14 +325,14 @@ int test_pool_force_close(int argc, char* argv[]) writecount = start_count; // { - std::vector msg_vec; - ErrorConditionT err; + std::vector msg_vec; + ErrorConditionT err; for (size_t i = 0; i < start_count; ++i) { - msg_vec.push_back(frame::mprpc::MessagePointerT(std::make_shared(i))); + msg_vec.push_back(MessagePointerT(frame::mprpc::make_message(i))); } { - std::vector::iterator it = msg_vec.begin(); + std::vector::iterator it = msg_vec.begin(); { ++crtwriteidx; diff --git a/solid/frame/mprpc/test/test_protocol_basic.cpp b/solid/frame/mprpc/test/test_protocol_basic.cpp index 0963ee6a..eac25d17 100644 --- a/solid/frame/mprpc/test/test_protocol_basic.cpp +++ b/solid/frame/mprpc/test/test_protocol_basic.cpp @@ -48,9 +48,9 @@ InitStub initarray[] = { std::string pattern; const size_t initarraysize = sizeof(initarray) / sizeof(InitStub); -size_t crtwriteidx = 0; -size_t crtreadidx = 0; -size_t writecount = 0; +size_t crtwriteidx = 0; +uint32_t crtreadidx = 0; +size_t writecount = 0; size_t real_size(size_t _sz) { @@ -114,10 +114,12 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void complete_message( frame::mprpc::ConnectionContext& _rctx, - frame::mprpc::MessagePointerT& _rmessage_ptr, - frame::mprpc::MessagePointerT& _rresponse_ptr, + MessagePointerT& _rmessage_ptr, + MessagePointerT& _rresponse_ptr, ErrorConditionT const& _rerr); struct Context { @@ -142,8 +144,8 @@ frame::mprpc::ConnectionContext& mprpcconctx(frame::mprpc::TestEntryway::createC void complete_message( frame::mprpc::ConnectionContext& _rctx, - frame::mprpc::MessagePointerT& _rmessage_ptr, - frame::mprpc::MessagePointerT& _rresponse_ptr, + MessagePointerT& _rmessage_ptr, + MessagePointerT& _rresponse_ptr, ErrorConditionT const& _rerr) { if (_rerr) { @@ -168,7 +170,7 @@ void complete_message( frame::mprpc::MessageId pool_msg_id; msgbundle.message_flags = initarray[crtwriteidx % initarraysize].flags; - msgbundle.message_ptr = frame::mprpc::MessagePointerT(std::make_shared(crtwriteidx)); + msgbundle.message_ptr = frame::mprpc::make_message(crtwriteidx); msgbundle.message_type_id = ctx.mprpcprotocol->typeIndex(msgbundle.message_ptr.get()); bool rv = ctx.mprpcmsgwriter->enqueue( @@ -203,10 +205,10 @@ struct Receiver : frame::mprpc::MessageReader::Receiver { } } - void receiveMessage(frame::mprpc::MessagePointerT& _rresponse_ptr, const size_t _msg_type_id) override + void receiveMessage(frame::mprpc::MessagePointerT<>& _rresponse_ptr, const size_t _msg_type_id) override { - frame::mprpc::MessagePointerT message_ptr; - ErrorConditionT error; + frame::mprpc::MessagePointerT<> message_ptr; + ErrorConditionT error; rprotocol_.complete(_msg_type_id, mprpcconctx, message_ptr, _rresponse_ptr, error); } @@ -252,8 +254,8 @@ struct Sender : frame::mprpc::MessageWriter::Sender { ErrorConditionT completeMessage(frame::mprpc::MessageBundle& _rmsgbundle, frame::mprpc::MessageId const& /*_rmsgid*/) override { solid_dbg(generic_logger, Info, "writer complete message"); - frame::mprpc::MessagePointerT response_ptr; - ErrorConditionT error; + frame::mprpc::MessagePointerT<> response_ptr; + ErrorConditionT error; rprotocol_.complete(_rmsgbundle.message_type_id, mprpcconctx, _rmsgbundle.message_ptr, response_ptr, error); return ErrorConditionT(); } @@ -313,7 +315,7 @@ int test_protocol_basic(int argc, char* argv[]) frame::mprpc::MessageId pool_msg_id; msgbundle.message_flags = initarray[crtwriteidx % initarraysize].flags; - msgbundle.message_ptr = frame::mprpc::MessagePointerT(std::make_shared(crtwriteidx)); + msgbundle.message_ptr = MessagePointerT(frame::mprpc::make_message(crtwriteidx)); msgbundle.message_type_id = ctx.mprpcprotocol->typeIndex(msgbundle.message_ptr.get()); bool rv = mprpcmsgwriter.enqueue( diff --git a/solid/frame/mprpc/test/test_protocol_cancel.cpp b/solid/frame/mprpc/test/test_protocol_cancel.cpp index 25f80893..a9f9f80e 100644 --- a/solid/frame/mprpc/test/test_protocol_cancel.cpp +++ b/solid/frame/mprpc/test/test_protocol_cancel.cpp @@ -104,12 +104,12 @@ struct Message : frame::mprpc::Message { } }; -using MessagePointerT = std::shared_ptr; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; void complete_message( frame::mprpc::ConnectionContext& _rctx, - frame::mprpc::MessagePointerT& _rmessage_ptr, - frame::mprpc::MessagePointerT& _rresponse_ptr, + MessagePointerT& _rmessage_ptr, + MessagePointerT& _rresponse_ptr, ErrorConditionT const& _rerr); struct Context { @@ -153,8 +153,8 @@ struct Sender : frame::mprpc::MessageWriter::Sender { ErrorConditionT completeMessage(frame::mprpc::MessageBundle& _rmsgbundle, frame::mprpc::MessageId const& /*_rmsgid*/) override { solid_dbg(generic_logger, Info, "writer complete message"); - frame::mprpc::MessagePointerT response_ptr; - ErrorConditionT error; + frame::mprpc::MessagePointerT<> response_ptr; + ErrorConditionT error; rprotocol_.complete(_rmsgbundle.message_type_id, mprpcconctx, _rmsgbundle.message_ptr, response_ptr, error); return ErrorConditionT(); } @@ -168,8 +168,8 @@ struct Sender : frame::mprpc::MessageWriter::Sender { void complete_message( frame::mprpc::ConnectionContext& _rctx, - frame::mprpc::MessagePointerT& _rmessage_ptr, - frame::mprpc::MessagePointerT& _rresponse_ptr, + MessagePointerT& _rmessage_ptr, + MessagePointerT& _rresponse_ptr, ErrorConditionT const& _rerr) { if (_rerr && _rerr != frame::mprpc::error_message_canceled) { @@ -229,10 +229,10 @@ struct Receiver : frame::mprpc::MessageReader::Receiver { } } - void receiveMessage(frame::mprpc::MessagePointerT& _rresponse_ptr, const size_t _msg_type_id) override + void receiveMessage(frame::mprpc::MessagePointerT<>& _rresponse_ptr, const size_t _msg_type_id) override { - frame::mprpc::MessagePointerT message_ptr; - ErrorConditionT error; + frame::mprpc::MessagePointerT<> message_ptr; + ErrorConditionT error; rprotocol_.complete(_msg_type_id, mprpcconctx, message_ptr, _rresponse_ptr, error); } @@ -311,7 +311,7 @@ int test_protocol_cancel(int argc, char* argv[]) frame::mprpc::MessageId pool_msg_id; msgbundle.message_flags = initarray[crtwriteidx % initarraysize].flags; - msgbundle.message_ptr = frame::mprpc::MessagePointerT(std::make_shared(crtwriteidx)); + msgbundle.message_ptr = MessagePointerT(frame::mprpc::make_message(crtwriteidx)); msgbundle.message_type_id = ctx.mprpcprotocol->typeIndex(msgbundle.message_ptr.get()); bool rv = mprpcmsgwriter.enqueue( diff --git a/solid/frame/mprpc/test/test_protocol_synchronous.cpp b/solid/frame/mprpc/test/test_protocol_synchronous.cpp index 39dfccac..d704bc85 100644 --- a/solid/frame/mprpc/test/test_protocol_synchronous.cpp +++ b/solid/frame/mprpc/test/test_protocol_synchronous.cpp @@ -98,10 +98,12 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void complete_message( frame::mprpc::ConnectionContext& _rctx, - frame::mprpc::MessagePointerT& _rmessage_ptr, - frame::mprpc::MessagePointerT& _rresponse_ptr, + MessagePointerT& _rmessage_ptr, + MessagePointerT& _rresponse_ptr, ErrorConditionT const& _rerr); struct Context { @@ -126,8 +128,8 @@ frame::mprpc::ConnectionContext& mprpcconctx(frame::mprpc::TestEntryway::createC void complete_message( frame::mprpc::ConnectionContext& _rctx, - frame::mprpc::MessagePointerT& _rmessage_ptr, - frame::mprpc::MessagePointerT& _rresponse_ptr, + MessagePointerT& _rmessage_ptr, + MessagePointerT& _rresponse_ptr, ErrorConditionT const& _rerr) { if (_rerr) { @@ -155,7 +157,7 @@ void complete_message( frame::mprpc::MessageId pool_msg_id; msgbundle.message_flags = initarray[crtwriteidx % initarraysize].flags; - msgbundle.message_ptr = frame::mprpc::MessagePointerT(std::make_shared(crtwriteidx)); + msgbundle.message_ptr = MessagePointerT(frame::mprpc::make_message(crtwriteidx)); msgbundle.message_type_id = ctx.mprpcprotocol->typeIndex(msgbundle.message_ptr.get()); bool rv = ctx.mprpcmsgwriter->enqueue( @@ -189,10 +191,10 @@ struct Receiver : frame::mprpc::MessageReader::Receiver { } } - void receiveMessage(frame::mprpc::MessagePointerT& _rresponse_ptr, const size_t _msg_type_id) override + void receiveMessage(frame::mprpc::MessagePointerT<>& _rresponse_ptr, const size_t _msg_type_id) override { - frame::mprpc::MessagePointerT message_ptr; - ErrorConditionT error; + frame::mprpc::MessagePointerT<> message_ptr; + ErrorConditionT error; rprotocol_.complete(_msg_type_id, mprpcconctx, message_ptr, _rresponse_ptr, error); } @@ -238,8 +240,8 @@ struct Sender : frame::mprpc::MessageWriter::Sender { ErrorConditionT completeMessage(frame::mprpc::MessageBundle& _rmsgbundle, frame::mprpc::MessageId const& /*_rmsgid*/) override { solid_dbg(generic_logger, Info, "writer complete message"); - frame::mprpc::MessagePointerT response_ptr; - ErrorConditionT error; + frame::mprpc::MessagePointerT<> response_ptr; + ErrorConditionT error; rprotocol_.complete(_rmsgbundle.message_type_id, mprpcconctx, _rmsgbundle.message_ptr, response_ptr, error); return ErrorConditionT(); } @@ -299,7 +301,7 @@ int test_protocol_synchronous(int argc, char* argv[]) frame::mprpc::MessageId pool_msg_id; msgbundle.message_flags = initarray[crtwriteidx % initarraysize].flags; - msgbundle.message_ptr = frame::mprpc::MessagePointerT(std::make_shared(crtwriteidx)); + msgbundle.message_ptr = MessagePointerT(frame::mprpc::make_message(crtwriteidx)); msgbundle.message_type_id = ctx.mprpcprotocol->typeIndex(msgbundle.message_ptr.get()); bool rv = mprpcmsgwriter.enqueue( diff --git a/solid/frame/mprpc/test/test_raw_basic.cpp b/solid/frame/mprpc/test/test_raw_basic.cpp index 89060a5d..e6aec2c1 100644 --- a/solid/frame/mprpc/test/test_raw_basic.cpp +++ b/solid/frame/mprpc/test/test_raw_basic.cpp @@ -155,6 +155,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -247,7 +249,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -282,7 +284,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -423,7 +425,7 @@ int test_raw_basic(int argc, char* argv[]) writecount = 10; // initarraysize * 10;//start_count;// for (; crtwriteidx < start_count;) { - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + MessagePointerT msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; mprpcclient.sendMessage( "localhost", msgptr, diff --git a/solid/frame/mprpc/test/test_raw_proxy.cpp b/solid/frame/mprpc/test/test_raw_proxy.cpp index fadc300b..e3237922 100644 --- a/solid/frame/mprpc/test/test_raw_proxy.cpp +++ b/solid/frame/mprpc/test/test_raw_proxy.cpp @@ -154,6 +154,8 @@ struct Message : frame::mprpc::Message { } }; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + void client_connection_stop(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rctx.error().message()); @@ -246,7 +248,7 @@ void server_connection_start(frame::mprpc::ConnectionContext& _rctx) void client_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -281,7 +283,7 @@ void client_complete_message( void server_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -422,7 +424,7 @@ int test_raw_proxy(int argc, char* argv[]) writecount = 10; // initarraysize * 10;//start_count;// for (; crtwriteidx < start_count;) { - frame::mprpc::MessagePointerT msgptr(std::make_shared(crtwriteidx)); + MessagePointerT msgptr(frame::mprpc::make_message(crtwriteidx)); ++crtwriteidx; mprpcclient.sendMessage( "localhost", msgptr, diff --git a/solid/frame/mprpc/test/test_relay_basic.cpp b/solid/frame/mprpc/test/test_relay_basic.cpp index af845077..98619b47 100644 --- a/solid/frame/mprpc/test/test_relay_basic.cpp +++ b/solid/frame/mprpc/test/test_relay_basic.cpp @@ -184,6 +184,9 @@ struct Message : frame::mprpc::Message { } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + //----------------------------------------------------------------------------- // PeerA //----------------------------------------------------------------------------- @@ -203,7 +206,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -244,7 +247,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -256,7 +259,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -274,7 +277,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -309,7 +312,7 @@ void peerb_complete_message( solid_dbg(generic_logger, Info, crtreadidx << " < " << writecount); if (crtwriteidx < writecount) { err = pmprpcpeera->sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); solid_check(!err, "Connection id should not be invalid! " << err.message()); @@ -404,8 +407,8 @@ int test_relay_basic(int argc, char* argv[]) auto con_register = [&relay_engine, test_ptr = std::move(test_ptr)]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) mutable { solid_check(!_rerror); solid_check(*test_ptr == "test", ""); @@ -553,7 +556,7 @@ int test_relay_basic(int argc, char* argv[]) for (; crtwriteidx < start_count;) { mprpcpeera.sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); } diff --git a/solid/frame/mprpc/test/test_relay_cancel_request.cpp b/solid/frame/mprpc/test/test_relay_cancel_request.cpp index 12b8f657..190e887c 100644 --- a/solid/frame/mprpc/test/test_relay_cancel_request.cpp +++ b/solid/frame/mprpc/test/test_relay_cancel_request.cpp @@ -232,6 +232,8 @@ struct Message : frame::mprpc::Message { return true; } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; //----------------------------------------------------------------------------- // PeerA @@ -252,7 +254,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -291,7 +293,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -303,7 +305,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -321,7 +323,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -358,7 +360,7 @@ void peerb_complete_message( auto& back_msg_id = msgid_vec.back(); mtx.unlock(); err = pmprpcpeera->sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), back_msg_id.first, back_msg_id.second, initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); @@ -457,8 +459,8 @@ int test_relay_cancel_request(int argc, char* argv[]) }; auto con_register = [&relay_engine]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr) { @@ -609,7 +611,7 @@ int test_relay_cancel_request(int argc, char* argv[]) auto& back_msg_id = msgid_vec.back(); mtx.unlock(); mprpcpeera.sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), back_msg_id.first, back_msg_id.second, initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); diff --git a/solid/frame/mprpc/test/test_relay_cancel_response.cpp b/solid/frame/mprpc/test/test_relay_cancel_response.cpp index f9451a41..5037d7bd 100644 --- a/solid/frame/mprpc/test/test_relay_cancel_response.cpp +++ b/solid/frame/mprpc/test/test_relay_cancel_response.cpp @@ -231,6 +231,9 @@ struct Message : frame::mprpc::Message { } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + //----------------------------------------------------------------------------- // PeerA //----------------------------------------------------------------------------- @@ -250,7 +253,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -286,7 +289,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -298,7 +301,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -316,7 +319,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -354,7 +357,7 @@ void peerb_complete_message( auto& back_msg_id = msgid_vec.back(); mtx.unlock(); err = pmprpcpeera->sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), back_msg_id.first, back_msg_id.second, initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); @@ -449,8 +452,8 @@ int test_relay_cancel_response(int argc, char* argv[]) }; auto con_register = [&relay_engine]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr) { @@ -601,7 +604,7 @@ int test_relay_cancel_response(int argc, char* argv[]) auto& back_msg_id = msgid_vec.back(); mtx.unlock(); mprpcpeera.sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), back_msg_id.first, back_msg_id.second, initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); diff --git a/solid/frame/mprpc/test/test_relay_close_request.cpp b/solid/frame/mprpc/test/test_relay_close_request.cpp index b677ca60..7809719f 100644 --- a/solid/frame/mprpc/test/test_relay_close_request.cpp +++ b/solid/frame/mprpc/test/test_relay_close_request.cpp @@ -217,6 +217,9 @@ struct Message : frame::mprpc::Message { } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + //----------------------------------------------------------------------------- // PeerA //----------------------------------------------------------------------------- @@ -236,7 +239,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -257,7 +260,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -269,7 +272,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -287,7 +290,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -408,8 +411,8 @@ int test_relay_close_request(int argc, char* argv[]) }; auto con_register = [&relay_engine]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr) { @@ -560,7 +563,7 @@ int test_relay_close_request(int argc, char* argv[]) auto& back_msg_id = msgid_vec.back(); mtx.unlock(); mprpcpeera.sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), back_msg_id.first, back_msg_id.second, initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); diff --git a/solid/frame/mprpc/test/test_relay_close_response.cpp b/solid/frame/mprpc/test/test_relay_close_response.cpp index 40612b97..8f1511c3 100644 --- a/solid/frame/mprpc/test/test_relay_close_response.cpp +++ b/solid/frame/mprpc/test/test_relay_close_response.cpp @@ -213,6 +213,9 @@ struct Message : frame::mprpc::Message { } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + //----------------------------------------------------------------------------- // PeerA //----------------------------------------------------------------------------- @@ -232,7 +235,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -258,7 +261,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -270,7 +273,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -288,7 +291,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -408,8 +411,8 @@ int test_relay_close_response(int argc, char* argv[]) }; auto con_register = [&relay_engine]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr) { @@ -566,7 +569,7 @@ int test_relay_close_response(int argc, char* argv[]) auto& back_msg_id = msgid_vec.back(); mtx.unlock(); mprpcpeera.sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), back_msg_id.first, back_msg_id.second, initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); diff --git a/solid/frame/mprpc/test/test_relay_detect_close.cpp b/solid/frame/mprpc/test/test_relay_detect_close.cpp index eb3185ff..b651d81f 100644 --- a/solid/frame/mprpc/test/test_relay_detect_close.cpp +++ b/solid/frame/mprpc/test/test_relay_detect_close.cpp @@ -101,6 +101,9 @@ struct Message : frame::mprpc::Message { } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + //----------------------------------------------------------------------------- // PeerA //----------------------------------------------------------------------------- @@ -117,7 +120,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -130,8 +133,8 @@ void peera_complete_message( } void peera_complete_detect_close( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + solid::frame::mprpc::MessagePointerT& _rsent_msg_ptr, solid::frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { static size_t call_count = 0; @@ -154,7 +157,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -166,7 +169,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -184,7 +187,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -220,18 +223,18 @@ void peerb_complete_message( } void peerb_complete_detect_close( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + solid::frame::mprpc::MessagePointerT& _rsent_msg_ptr, solid::frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " received DetectCloseMessage on peerb"); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 1), {frame::mprpc::MessageFlagsE::ResponsePart}); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 2), {frame::mprpc::MessageFlagsE::ResponsePart}); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 3), {frame::mprpc::MessageFlagsE::ResponsePart}); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 4), {frame::mprpc::MessageFlagsE::ResponsePart}); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 5), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 1), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 2), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 3), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 4), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 5), {frame::mprpc::MessageFlagsE::ResponsePart}); _rrecv_msg_ptr->idx = 6; _rctx.service().sendResponse(_rctx.recipientId(), std::move(_rrecv_msg_ptr), {frame::mprpc::MessageFlagsE::ResponsePart}); } @@ -278,8 +281,8 @@ int test_relay_detect_close(int argc, char* argv[]) }; auto con_register = [&relay_engine]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr) { @@ -425,10 +428,10 @@ int test_relay_detect_close(int argc, char* argv[]) err = mprpcpeerb.createConnectionPool("localhost"); solid_check(!err, "failed create connection from peerb: " << err.message()); - mprpcpeera.sendMessage("localhost/b", std::make_shared(), {frame::mprpc::MessageFlagsE::AwaitResponse}); + mprpcpeera.sendMessage("localhost/b", frame::mprpc::make_message(), {frame::mprpc::MessageFlagsE::AwaitResponse}); mprpcpeera.sendMessage( - "localhost/b", std::make_shared(), + "localhost/b", frame::mprpc::make_message(), {frame::mprpc::MessageFlagsE::AwaitResponse}); unique_lock lock(mtx); diff --git a/solid/frame/mprpc/test/test_relay_detect_close_while_response.cpp b/solid/frame/mprpc/test/test_relay_detect_close_while_response.cpp index 134154cc..e101bbf5 100644 --- a/solid/frame/mprpc/test/test_relay_detect_close_while_response.cpp +++ b/solid/frame/mprpc/test/test_relay_detect_close_while_response.cpp @@ -147,6 +147,9 @@ struct Message : frame::mprpc::Message { } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; + //----------------------------------------------------------------------------- // PeerA //----------------------------------------------------------------------------- @@ -163,7 +166,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -172,8 +175,8 @@ void peera_complete_message( } void peera_complete_detect_close( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + solid::frame::mprpc::MessagePointerT& _rsent_msg_ptr, solid::frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { static size_t call_count = 0; @@ -182,7 +185,7 @@ void peera_complete_detect_close( if (_rrecv_msg_ptr) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " peera received DetectCloseMessage " << _rrecv_msg_ptr->idx); solid_check(!_rrecv_msg_ptr->isResponseLast()); - pmprpcpeera->sendMessage("localhost/b", std::make_shared(_rrecv_msg_ptr->idx, generate_big_data(1024 * 10))); + pmprpcpeera->sendMessage("localhost/b", frame::mprpc::make_message(_rrecv_msg_ptr->idx, generate_big_data(1024 * 10))); } if (_rerror == frame::mprpc::error_message_canceled_peer) { @@ -197,7 +200,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -209,7 +212,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -227,7 +230,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -259,17 +262,17 @@ void peerb_complete_message( } void peerb_complete_detect_close( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::ConnectionContext& _rctx, + solid::frame::mprpc::MessagePointerT& _rsent_msg_ptr, solid::frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " received DetectCloseMessage on peerb"); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 1), {frame::mprpc::MessageFlagsE::ResponsePart}); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 2, generate_big_data(1024 * 1000)), {frame::mprpc::MessageFlagsE::ResponsePart}); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 3, generate_big_data(1024 * 100)), {frame::mprpc::MessageFlagsE::ResponsePart}); - _rctx.service().sendResponse(_rctx.recipientId(), make_shared(*_rrecv_msg_ptr, 4, generate_big_data(1024 * 10)), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 1), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 2, generate_big_data(1024 * 1000)), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 3, generate_big_data(1024 * 100)), {frame::mprpc::MessageFlagsE::ResponsePart}); + _rctx.service().sendResponse(_rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr, 4, generate_big_data(1024 * 10)), {frame::mprpc::MessageFlagsE::ResponsePart}); _rrecv_msg_ptr->idx = 5; _rrecv_msg_ptr->data_ = generate_big_data(1024 * 1024 * 100); // 100MB _rctx.service().sendResponse(_rctx.recipientId(), std::move(_rrecv_msg_ptr), {frame::mprpc::MessageFlagsE::ResponsePart}); @@ -317,8 +320,8 @@ int test_relay_detect_close_while_response(int argc, char* argv[]) }; auto con_register = [&relay_engine]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr) { @@ -465,7 +468,7 @@ int test_relay_detect_close_while_response(int argc, char* argv[]) solid_check(!err, "failed create connection from peerb: " << err.message()); pmprpcpeera = &mprpcpeera; - mprpcpeera.sendMessage("localhost/b", std::make_shared(), {frame::mprpc::MessageFlagsE::AwaitResponse}); + mprpcpeera.sendMessage("localhost/b", frame::mprpc::make_message(), {frame::mprpc::MessageFlagsE::AwaitResponse}); unique_lock lock(mtx); diff --git a/solid/frame/mprpc/test/test_relay_disabled.cpp b/solid/frame/mprpc/test/test_relay_disabled.cpp index 7f8d5161..1e3c29d7 100644 --- a/solid/frame/mprpc/test/test_relay_disabled.cpp +++ b/solid/frame/mprpc/test/test_relay_disabled.cpp @@ -182,6 +182,8 @@ struct Message : frame::mprpc::Message { return true; } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; //----------------------------------------------------------------------------- // PeerA @@ -202,7 +204,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -228,7 +230,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -240,7 +242,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -258,7 +260,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -284,7 +286,7 @@ void peerb_complete_message( solid_dbg(generic_logger, Info, crtreadidx); if (crtwriteidx < writecount) { err = pmprpcpeera->sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); solid_check(!err, "Connection id should not be invalid! " << err.message()); @@ -369,8 +371,8 @@ int test_relay_disabled(int argc, char* argv[]) auto con_stop = [](frame::mprpc::ConnectionContext& _rctx) {}; auto con_register = []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { }; @@ -502,7 +504,7 @@ int test_relay_disabled(int argc, char* argv[]) if (1) { for (; crtwriteidx < writecount;) { mprpcpeera.sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); } } diff --git a/solid/frame/mprpc/test/test_relay_split.cpp b/solid/frame/mprpc/test/test_relay_split.cpp index f9e6879a..ccd8f494 100644 --- a/solid/frame/mprpc/test/test_relay_split.cpp +++ b/solid/frame/mprpc/test/test_relay_split.cpp @@ -201,6 +201,8 @@ struct Message : frame::mprpc::Message { return true; } }; +using RegisterPointerT = solid::frame::mprpc::MessagePointerT; +using MessagePointerT = solid::frame::mprpc::MessagePointerT; //----------------------------------------------------------------------------- // PeerA @@ -221,7 +223,7 @@ void peera_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peera_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId() << " error: " << _rerror.message()); @@ -271,7 +273,7 @@ void peerb_connection_start(frame::mprpc::ConnectionContext& _rctx) { solid_dbg(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared("b"); + auto msgptr = frame::mprpc::make_message("b"); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); } @@ -283,7 +285,7 @@ void peerb_connection_stop(frame::mprpc::ConnectionContext& _rctx) void peerb_complete_register( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_dbg(generic_logger, Info, _rctx.recipientId()); @@ -301,7 +303,7 @@ void peerb_complete_register( void peerb_complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, std::shared_ptr& _rrecv_msg_ptr, + MessagePointerT& _rsent_msg_ptr, MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -317,7 +319,7 @@ void peerb_complete_message( for (size_t i = 1; i < _rrecv_msg_ptr->splitCount(); ++i) { err = _rctx.service().sendResponse( - _rctx.recipientId(), std::make_shared(*_rrecv_msg_ptr), + _rctx.recipientId(), frame::mprpc::make_message(*_rrecv_msg_ptr), {frame::mprpc::MessageFlagsE::ResponsePart}); solid_check(!err, "Connection id should not be invalid: " << err.message()); @@ -336,7 +338,7 @@ void peerb_complete_message( solid_dbg(generic_logger, Info, crtreadidx << " < " << writecount); if (crtwriteidx < writecount) { err = pmprpcpeera->sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); solid_check(!err, "Connection id should not be invalid! " << err.message()); @@ -431,8 +433,8 @@ int test_relay_split(int argc, char* argv[]) auto con_register = [&relay_engine, test_ptr = std::move(test_ptr)]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + RegisterPointerT& _rsent_msg_ptr, + RegisterPointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(*test_ptr == "test", ""); @@ -581,7 +583,7 @@ int test_relay_split(int argc, char* argv[]) for (; crtwriteidx < start_count;) { mprpcpeera.sendMessage( - "localhost/b", std::make_shared(crtwriteidx++), + "localhost/b", frame::mprpc::make_message(crtwriteidx++), initarray[crtwriteidx % initarraysize].flags | frame::mprpc::MessageFlagsE::AwaitResponse); } diff --git a/solid/frame/reactor.hpp b/solid/frame/reactor.hpp index 7d40633a..64e8b758 100644 --- a/solid/frame/reactor.hpp +++ b/solid/frame/reactor.hpp @@ -100,13 +100,13 @@ class Reactor : public frame::ReactorBase { Pimpl impl_; protected: - const size_t wake_capacity_; - ReactorStatistic& rstatistic_; - size_t actor_count_ = 0; - size_t current_exec_size_ = 0; - alignas(hardware_destructive_interference_size) std::atomic_size_t push_wake_index_ = {0}; - alignas(hardware_destructive_interference_size) std::atomic_size_t pop_wake_index_ = {0}; - std::atomic_size_t pending_wake_count_ = {0}; + const size_t wake_capacity_; + ReactorStatistic& rstatistic_; + size_t actor_count_ = 0; + size_t current_exec_size_ = 0; + size_t pop_wake_index_ = {0}; + std::atomic_size_t push_wake_index_ = {0}; + std::atomic_size_t pending_wake_count_ = {0}; public: using StatisticT = ReactorStatistic; @@ -490,7 +490,7 @@ class Reactor : public impl::Reactor { ReactorContext ctx(context(_rcrttime)); while (true) { - const size_t index = pop_wake_index_.load() % wake_capacity_; + const size_t index = pop_wake_index_ % wake_capacity_; auto& rstub = wake_arr_[index]; if (rstub.isFilled()) { if (rstub.actor_ptr_) [[unlikely]] { diff --git a/solid/reflection/v1/dispatch.hpp b/solid/reflection/v1/dispatch.hpp index 737bcf72..719d59de 100644 --- a/solid/reflection/v1/dispatch.hpp +++ b/solid/reflection/v1/dispatch.hpp @@ -31,6 +31,7 @@ enum struct TypeGroupE { Enum, SharedPtr, UniquePtr, + IntrusivePtr, Tuple, IStream, OStream, @@ -42,6 +43,9 @@ constexpr TypeGroupE type_group() if constexpr (solid::is_shared_ptr_v) { return TypeGroupE::SharedPtr; } + if constexpr (solid::is_intrusive_ptr_v) { + return TypeGroupE::IntrusivePtr; + } if constexpr (solid::is_unique_ptr_v) { return TypeGroupE::UniquePtr; } else { diff --git a/solid/reflection/v1/metadata.hpp b/solid/reflection/v1/metadata.hpp index 7ee23cbe..f7a609aa 100644 --- a/solid/reflection/v1/metadata.hpp +++ b/solid/reflection/v1/metadata.hpp @@ -316,7 +316,7 @@ inline constexpr auto factory = [](const auto& _rt, auto& _rctx, const TypeMapBa using value_t = std::decay_t; if constexpr (std::is_enum_v) { return Enum{}; - } else if constexpr (is_shared_ptr_v || is_unique_ptr_v) { + } else if constexpr (is_shared_ptr_v || is_unique_ptr_v || is_intrusive_ptr_v) { return Pointer{_ptype_map}; } else if constexpr (std::is_signed_v) { return SignedInteger{std::numeric_limits::min(), std::numeric_limits::max()}; diff --git a/solid/reflection/v1/ostreamreflection.hpp b/solid/reflection/v1/ostreamreflection.hpp index 616d500d..fab87d0c 100644 --- a/solid/reflection/v1/ostreamreflection.hpp +++ b/solid/reflection/v1/ostreamreflection.hpp @@ -127,6 +127,17 @@ struct OStreamVisitor { rostream_ << "nullptr" << eol_; } } break; + case tg::IntrusivePtr: { + rostream_ << _name << '(' << _index << ") -> "; + auto& rptr_node = *_rnode.template as(); + + if (!rptr_node.isNull()) { + do_indent_ = false; + rptr_node.visit(std::ref(*this), _rmeta.pointer()->map(), _rctx); + } else { + rostream_ << "nullptr" << eol_; + } + } break; default: break; } diff --git a/solid/reflection/v1/reflector.hpp b/solid/reflection/v1/reflector.hpp index 39aaa84c..020fde50 100644 --- a/solid/reflection/v1/reflector.hpp +++ b/solid/reflection/v1/reflector.hpp @@ -224,6 +224,34 @@ class GroupNode : public BaseNode { } }; +template +class GroupNode : public BaseNode { +protected: + using ContextT = typename Reflector::ContextT; + using BaseT = BaseNode; + + GroupNode(Reflector& _rreflector, const std::type_info* const _ptype_info) + : BaseT(_rreflector, TypeGroupE::IntrusivePtr, _ptype_info) + { + } + +public: + bool isNull() const override = 0; + + template + void visit(DispatchFunction _dispatch_function, const TypeMapBase* _ptype_map, ContextT& _rctx) + { + Reflector new_reflector{this->rreflector_.metadataFactory(), _dispatch_function, this->rreflector_.typeMap()}; + this->doVisit(new_reflector, _ptype_map, _rctx); + } + template + void visit(DispatchFunction _dispatch_function, const TypeMapBase* _ptype_map, ContextT& _rctx) const + { + Reflector new_reflector{this->rreflector_.metadataFactory(), _dispatch_function, this->rreflector_.typeMap()}; + this->doVisit(new_reflector, _ptype_map, _rctx); + } +}; + template class GroupNode : public BaseNode { protected: @@ -397,7 +425,7 @@ class Node : public GroupNode>()> { void doVisit(Reflector& _rreflector, const TypeMapBase* _ptype_map, ContextT& _rctx) override { - if constexpr (type_group() == TypeGroupE::SharedPtr || type_group() == TypeGroupE::UniquePtr) { + if constexpr (type_group() == TypeGroupE::SharedPtr || type_group() == TypeGroupE::UniquePtr || type_group() == TypeGroupE::IntrusivePtr) { solid_check(ref_); if constexpr ( type_group() == TypeGroupE::Basic || type_group() == TypeGroupE::Container || type_group() == TypeGroupE::Enum || type_group() == TypeGroupE::Bitset) { @@ -411,7 +439,7 @@ class Node : public GroupNode>()> { void doVisit(Reflector& _rreflector, const TypeMapBase* _ptype_map, ContextT& _rctx) const override { - if constexpr (type_group() == TypeGroupE::SharedPtr || type_group() == TypeGroupE::UniquePtr) { + if constexpr (type_group() == TypeGroupE::SharedPtr || type_group() == TypeGroupE::UniquePtr || type_group() == TypeGroupE::IntrusivePtr) { solid_check(ref_); if constexpr ( type_group() == TypeGroupE::Basic || type_group() == TypeGroupE::Container || type_group() == TypeGroupE::Enum || type_group() == TypeGroupE::Bitset) { @@ -425,7 +453,7 @@ class Node : public GroupNode>()> { void reset(const std::string_view _name, const TypeMapBase* _ptype_map, ContextT& _rctx) override { - if constexpr (!std::is_const_v && (type_group() == TypeGroupE::SharedPtr || type_group() == TypeGroupE::UniquePtr)) { + if constexpr (!std::is_const_v && (type_group() == TypeGroupE::SharedPtr || type_group() == TypeGroupE::UniquePtr || type_group() == TypeGroupE::IntrusivePtr)) { solid_check(_ptype_map != nullptr); _ptype_map->create(_rctx, ref_, 0, _name); diff --git a/solid/reflection/v1/typemap.hpp b/solid/reflection/v1/typemap.hpp index 4dfbca90..ea93df88 100644 --- a/solid/reflection/v1/typemap.hpp +++ b/solid/reflection/v1/typemap.hpp @@ -46,15 +46,17 @@ class TypeMapBase : NonCopyable { using ReverseCastFunctionT = std::function; struct CastStub { - template - CastStub(SF _sf, UF _uf, RF _rf) + template + CastStub(SF _sf, UF _uf, IF _if, RF _rf) : shared_fnc_(_sf) , unique_fnc_(_uf) + , intrusive_fnc_(_if) , reverse_fnc_(_rf) { } CastFunctionT shared_fnc_; CastFunctionT unique_fnc_; + CastFunctionT intrusive_fnc_; ReverseCastFunctionT reverse_fnc_; }; using TypeIndexPairT = std::pair; @@ -73,6 +75,7 @@ class TypeMapBase : NonCopyable { ReflectFunctionT reflect_fnc_; CreateFunctionT create_shared_fnc_; CreateFunctionT create_unique_fnc_; + CreateFunctionT create_intrusive_fnc_; }; using ReflectorVectorT = std::vector; struct TypeStub { @@ -194,7 +197,7 @@ class TypeMapBase : NonCopyable { template size_t create(typename Reflector::ContextT& _rctx, Ptr& _rptr, const size_t _category, const std::string_view _name) const { - static_assert(solid::is_shared_ptr_v || solid::is_unique_ptr_v); + static_assert(solid::is_shared_ptr_v || solid::is_unique_ptr_v || solid::is_intrusive_ptr_v); const size_t reflector_index = reflectorIndex(); solid_assert(reflector_index != solid::InvalidIndex()); @@ -219,9 +222,12 @@ class TypeMapBase : NonCopyable { if constexpr (solid::is_shared_ptr_v) { rtypestub.reflector_vec_[reflector_index].create_shared_fnc_(&_rctx, &_rptr, rcaststub.shared_fnc_); - } else { // unique_ptr + } else if constexpr (solid::is_unique_ptr_v) { // unique_ptr static_assert(std::is_same_v>, "Only unique with default deleter is supported"); rtypestub.reflector_vec_[reflector_index].create_unique_fnc_(&_rctx, &_rptr, rcaststub.unique_fnc_); + } else { + static_assert(solid::is_intrusive_ptr_v); + rtypestub.reflector_vec_[reflector_index].create_intrusive_fnc_(&_rctx, &_rptr, rcaststub.intrusive_fnc_); } return it->second; } else { @@ -314,7 +320,7 @@ class TypeMapBase : NonCopyable { { const size_t reflector_index = reflectorIndex(); solid_assert(reflector_index != solid::InvalidIndex()); - static_assert(solid::is_shared_ptr_v || solid::is_unique_ptr_v); + static_assert(solid::is_shared_ptr_v || solid::is_unique_ptr_v || solid::is_intrusive_ptr_v); solid_assert(_category < category_vec_.size()); _rptr.reset(); @@ -338,9 +344,11 @@ class TypeMapBase : NonCopyable { if constexpr (solid::is_shared_ptr_v) { rtypestub.reflector_vec_[reflector_index].create_shared_fnc_(&_rctx, &_rptr, rcaststub.shared_fnc_); - } else { // unique_ptr + } else if constexpr (solid::is_unique_ptr_v) { // unique_ptr static_assert(std::is_same_v>, "Only unique with default deleter is supported"); rtypestub.reflector_vec_[reflector_index].create_unique_fnc_(&_rctx, &_rptr, rcaststub.unique_fnc_); + } else { + rtypestub.reflector_vec_[reflector_index].create_intrusive_fnc_(&_rctx, &_rptr, rcaststub.intrusive_fnc_); } rtypestub.reflector_vec_[reflector_index].reflect_fnc_(&_rreflector, _rptr.get(), &_rctx, rcaststub.reverse_fnc_); @@ -499,6 +507,15 @@ class TypeMap : public TypeMapBase { _cast(_pptr, &ptr); }; + type_vec_[_type_index].reflector_vec_[_index].create_intrusive_fnc_ = [_create_f](void* _pctx, void* _pptr, const CastFunctionT& _cast) { + if constexpr (std::is_base_of_v) { + typename Ref::ContextT& rctx = *reinterpret_cast(_pctx); + solid::IntrusivePtr ptr; + _create_f(rctx, ptr); + _cast(_pptr, &ptr); + } + }; + if constexpr (!is_empty_pack::value) { doInitTypeReflect(_create_f, _type_index, _index + 1); } @@ -553,6 +570,13 @@ class TypeMap : public TypeMapBase { std::unique_ptr& rfrom = *reinterpret_cast*>(_pfrom); rto = std::move(rfrom); }, + [](void* _pto, void* _pfrom) { + if constexpr (std::is_base_of_v && std::is_base_of_v) { + solid::IntrusivePtr& rto = *reinterpret_cast*>(_pto); + solid::IntrusivePtr& rfrom = *reinterpret_cast*>(_pfrom); + rto = std::move(rfrom); + } + }, [](const void* _pfrom) { return static_cast(reinterpret_cast(_pfrom)); }); diff --git a/solid/serialization/v3/binarybasic.hpp b/solid/serialization/v3/binarybasic.hpp index a1d0e8fc..6d228e69 100644 --- a/solid/serialization/v3/binarybasic.hpp +++ b/solid/serialization/v3/binarybasic.hpp @@ -43,8 +43,8 @@ inline char* store(char* _pd, const uint16_t _val, TypeToType _ff) *(pd + 0) = c.bytes_[1]; *(pd + 1) = c.bytes_[0]; #else - *(pd + 0) = c.bytes_[0]; - *(pd + 1) = c.bytes_[1]; + *(pd + 0) = c.bytes_[0]; + *(pd + 1) = c.bytes_[1]; #endif return _pd + 2; } @@ -65,10 +65,10 @@ inline char* store(char* _pd, const uint32_t _val, TypeToType _ff) *(pd + 2) = c.bytes_[1]; *(pd + 3) = c.bytes_[0]; #else - *(pd + 0) = c.bytes_[0]; - *(pd + 1) = c.bytes_[1]; - *(pd + 2) = c.bytes_[2]; - *(pd + 3) = c.bytes_[3]; + *(pd + 0) = c.bytes_[0]; + *(pd + 1) = c.bytes_[1]; + *(pd + 2) = c.bytes_[2]; + *(pd + 3) = c.bytes_[3]; #endif return _pd + 4; } @@ -93,14 +93,14 @@ inline char* store(char* _pd, const uint64_t _val, TypeToType _ff) *(pd + 6) = c.bytes_[1]; *(pd + 7) = c.bytes_[0]; #else - *(pd + 0) = c.bytes_[0]; - *(pd + 1) = c.bytes_[1]; - *(pd + 2) = c.bytes_[2]; - *(pd + 3) = c.bytes_[3]; - *(pd + 4) = c.bytes_[4]; - *(pd + 5) = c.bytes_[5]; - *(pd + 6) = c.bytes_[6]; - *(pd + 7) = c.bytes_[7]; + *(pd + 0) = c.bytes_[0]; + *(pd + 1) = c.bytes_[1]; + *(pd + 2) = c.bytes_[2]; + *(pd + 3) = c.bytes_[3]; + *(pd + 4) = c.bytes_[4]; + *(pd + 5) = c.bytes_[5]; + *(pd + 6) = c.bytes_[6]; + *(pd + 7) = c.bytes_[7]; #endif return _pd + 8; } diff --git a/solid/serialization/v3/binarydeserializer.hpp b/solid/serialization/v3/binarydeserializer.hpp index bc78e482..3f4afdb4 100644 --- a/solid/serialization/v3/binarydeserializer.hpp +++ b/solid/serialization/v3/binarydeserializer.hpp @@ -1092,7 +1092,7 @@ class Deserializer : public DeserializerBase { void addDispatch(const Meta& _meta, T& _rt, ContextT& _rctx, const size_t _id, const char* const _name) { static_assert(!std::is_base_of_v, "Cannot use std::istream with Deserializer"); - if constexpr (!is_shared_ptr_v && !is_unique_ptr_v) { + if constexpr (!is_shared_ptr_v && !is_unique_ptr_v && !is_intrusive_ptr_v) { static_assert(!std::is_pointer_v, "Naked pointer are not supported - use std::shared_ptr or std::unique_ptr"); } static_assert(!std::is_floating_point_v, "Floating point values not supported"); @@ -1106,7 +1106,7 @@ class Deserializer : public DeserializerBase { addBasicCompacted(_rt.value_, _name); } else if constexpr (is_bitset_v) { addBitset(_rt, _name); - } else if constexpr (is_shared_ptr_v || is_unique_ptr_v) { + } else if constexpr (is_shared_ptr_v || is_unique_ptr_v || is_intrusive_ptr_v) { const auto* ptypemap = _meta.map(); solid_assert(ptypemap != nullptr); add(type_id_, _rctx, 1, "type_id"); diff --git a/solid/serialization/v3/binaryserializer.hpp b/solid/serialization/v3/binaryserializer.hpp index 541a3706..c42f9ee9 100644 --- a/solid/serialization/v3/binaryserializer.hpp +++ b/solid/serialization/v3/binaryserializer.hpp @@ -915,7 +915,7 @@ class Serializer : public SerializerBase { void addDispatch(const Meta& _meta, const T& _rt, ContextT& _rctx, const size_t _id, const char* const _name) { static_assert(!std::is_base_of_v, "Cannot use std::ostream with Serializer"); - if constexpr (!is_shared_ptr_v && !is_unique_ptr_v) { + if constexpr (!is_shared_ptr_v && !is_unique_ptr_v && !is_intrusive_ptr_v) { static_assert(!std::is_pointer_v, "Naked pointer are not supported - use std::shared_ptr or std::unique_ptr"); } @@ -931,7 +931,7 @@ class Serializer : public SerializerBase { addBasicCompacted(_rt.value_, _name); } else if constexpr (is_bitset_v) { addBitset(_rt, _name); - } else if constexpr (is_shared_ptr_v || is_unique_ptr_v) { + } else if constexpr (is_shared_ptr_v || is_unique_ptr_v || is_intrusive_ptr_v) { const auto* ptypemap = _meta.map(); solid_assert(ptypemap != nullptr); const auto index_tuple = ptypemap->id(_rt.get()); diff --git a/solid/system/configuration_impl.hpp.in b/solid/system/configuration_impl.hpp.in index 7b49a0db..5c396d03 100644 --- a/solid/system/configuration_impl.hpp.in +++ b/solid/system/configuration_impl.hpp.in @@ -26,3 +26,5 @@ #cmakedefine SOLID_USE_GCC_BSWAP #cmakedefine SOLID_FRAME_AIO_REACTOR_USE_SPINLOCK + +#cmakedefine SOLID_MPRPC_USE_SHARED_PTR_MESSAGE diff --git a/solid/system/convertors.hpp b/solid/system/convertors.hpp index 19e6a491..2b852875 100644 --- a/solid/system/convertors.hpp +++ b/solid/system/convertors.hpp @@ -52,7 +52,7 @@ constexpr #ifdef SOLID_ON_WINDOWS return _byteswap_ushort(_v); #else - return ((((_v) >> 8) & 0xff) | (((_v)&0xff) << 8)); + return ((((_v) >> 8) & 0xff) | (((_v) & 0xff) << 8)); #endif } diff --git a/solid/system/src/device.cpp b/solid/system/src/device.cpp index e4a1816e..8e7fa744 100644 --- a/solid/system/src/device.cpp +++ b/solid/system/src/device.cpp @@ -524,7 +524,7 @@ ErrorCodeT SocketDevice::connect(const SocketAddressStub& _rsas) #ifdef SOLID_ON_WINDOWS int rv = ::connect(descriptor(), _rsas.sockAddr(), _rsas.size()); #else - int rv = ::connect(descriptor(), _rsas.sockAddr(), _rsas.size()); + int rv = ::connect(descriptor(), _rsas.sockAddr(), _rsas.size()); #endif return rv == 0 ? ErrorCodeT() : last_socket_error(); } @@ -570,8 +570,8 @@ ErrorCodeT SocketDevice::prepareAccept(const SocketAddressStub& _rsas, size_t _l } return last_socket_error(); #else - int yes = 1; - int rv = setsockopt(descriptor(), SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&yes), sizeof(yes)); + int yes = 1; + int rv = setsockopt(descriptor(), SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&yes), sizeof(yes)); if (rv < 0) { return last_socket_error(); } diff --git a/solid/system/src/log.cpp b/solid/system/src/log.cpp index ea77b52a..d7467468 100644 --- a/solid/system/src/log.cpp +++ b/solid/system/src/log.cpp @@ -785,7 +785,7 @@ std::ostream& LoggerBase::doLog(std::ostream& _ros, const char* _flag_name, cons localtime_s(&loctm, &t_now); ploctm = &loctm; #else - tm loctm; + tm loctm; ploctm = localtime_r(&t_now, &loctm); #endif int sz = snprintf( diff --git a/solid/system/src/memory.cpp b/solid/system/src/memory.cpp index 200624c1..b4111efa 100644 --- a/solid/system/src/memory.cpp +++ b/solid/system/src/memory.cpp @@ -128,9 +128,9 @@ size_t getMemorySize() #if defined(CTL_HW) && (defined(HW_MEMSIZE) || defined(HW_PHYSMEM64)) int mib[2]; - mib[0] = CTL_HW; + mib[0] = CTL_HW; #if defined(HW_MEMSIZE) - mib[1] = HW_MEMSIZE; /* OSX. --------------------- */ + mib[1] = HW_MEMSIZE; /* OSX. --------------------- */ #elif defined(HW_PHYSMEM64) mib[1] = HW_PHYSMEM64; /* NetBSD, OpenBSD. --------- */ #endif @@ -155,9 +155,9 @@ size_t getMemorySize() #elif defined(CTL_HW) && (defined(HW_PHYSMEM) || defined(HW_REALMEM)) /* DragonFly BSD, FreeBSD, NetBSD, OpenBSD, and OSX. -------- */ int mib[2]; - mib[0] = CTL_HW; + mib[0] = CTL_HW; #if defined(HW_REALMEM) - mib[1] = HW_REALMEM; /* FreeBSD. ----------------- */ + mib[1] = HW_REALMEM; /* FreeBSD. ----------------- */ #elif defined(HW_PYSMEM) mib[1] = HW_PHYSMEM; /* Others. ------------------ */ #endif diff --git a/solid/utility/CMakeLists.txt b/solid/utility/CMakeLists.txt index 2cfb7f53..50aa7b0a 100644 --- a/solid/utility/CMakeLists.txt +++ b/solid/utility/CMakeLists.txt @@ -27,6 +27,9 @@ set(Headers sharedbuffer.hpp threadpool.hpp cacheable.hpp + cast.hpp + intrusiveptr.hpp + collapse.hpp ) set(Inlines diff --git a/solid/utility/cacheable.hpp b/solid/utility/cacheable.hpp index edbcb382..f0c6fabb 100644 --- a/solid/utility/cacheable.hpp +++ b/solid/utility/cacheable.hpp @@ -8,31 +8,37 @@ // See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. // +#include "solid/utility/cast.hpp" +#include "solid/utility/intrusiveptr.hpp" #include "solid/utility/stack.hpp" -#include namespace solid { -class Cacheable : public std::enable_shared_from_this { +class Cacheable { +protected: + virtual void doCache() {} + virtual void cacheableClear() {} + +public: + virtual ~Cacheable() {} +}; + +class SharedCacheable : public Cacheable, public std::enable_shared_from_this { template friend class EnableCacheable; - std::shared_ptr next_; + std::shared_ptr next_; - void doAttach(std::shared_ptr&& _other) + void doAttach(std::shared_ptr&& _other) { if (_other) { _other->next_ = std::move(next_); next_ = std::move(_other); } } - virtual void doCache() {} - virtual void cacheableClear() {} public: - virtual ~Cacheable() {} - void cache() { auto next = std::move(next_); @@ -49,20 +55,63 @@ class Cacheable : public std::enable_shared_from_this { template void cacheableAttach(const std::shared_ptr& _other) { - doAttach(std::static_pointer_cast(_other)); + doAttach(std::static_pointer_cast(_other)); } template void cacheableAttach(std::shared_ptr&& _other) { - doAttach(std::static_pointer_cast(std::move(_other))); + doAttach(std::static_pointer_cast(std::move(_other))); } }; + +class IntrusiveCacheable : public Cacheable, public IntrusiveThreadSafeBase { + + template + friend class EnableCacheable; + + IntrusivePtr next_; + + void doAttach(IntrusivePtr&& _other) + { + if (_other) { + _other->next_ = std::move(next_); + next_ = std::move(_other); + } + } + +public: + void cache() + { + auto next = std::move(next_); + cacheableClear(); + doCache(); + while (next) { + auto tmp = std::move(next->next_); + next->cacheableClear(); + next->doCache(); + std::swap(next, tmp); + } + } + + template + void cacheableAttach(const IntrusivePtr& _other) + { + doAttach(static_pointer_cast(_other)); + } + + template + void cacheableAttach(IntrusivePtr&& _other) + { + doAttach(static_pointer_cast(std::move(_other))); + } +}; + #ifdef __cpp_concepts template -concept CacheableDerived = std::is_base_of_v; +concept SharedCacheableDerived = std::is_base_of_v; -template +template #else template #endif @@ -74,6 +123,22 @@ void cacheable_cache(std::shared_ptr&& _what_ptr) } } +#ifdef __cpp_concepts +template +concept IntrusiveCacheableDerived = std::is_base_of_v; + +template +#else +template +#endif +void cacheable_cache(IntrusivePtr&& _what_ptr) +{ + if (_what_ptr) [[likely]] { + _what_ptr->cache(); + _what_ptr.reset(); + } +} + class ThreadLocalCache; template @@ -83,11 +148,21 @@ class EnableCacheable : public What { public: static auto create() { - std::shared_ptr ret = std::static_pointer_cast(Cache::template load()); - if (!ret) [[unlikely]] { - ret = std::make_shared(); + if constexpr (std::is_base_of_v) { + auto ret = static_pointer_cast(Cache::template load_ip()); + if (!ret) [[unlikely]] { + ret = make_intrusive(); + } + return ret; + } else { + static_assert(std::is_base_of_v, "Type must be derived from SharedCacheable"); + auto p{Cache::template load_sp()}; + auto ret = std::static_pointer_cast(std::move(p)); + if (!ret) [[unlikely]] { + ret = std::make_shared(); + } + return ret; } - return ret; } template @@ -99,30 +174,47 @@ class EnableCacheable : public What { private: void doCache() override { - auto what = std::static_pointer_cast(this->shared_from_this()); - Cache::store(std::move(what)); + if constexpr (std::is_base_of_v) { + Cache::store(IntrusivePtr(static_cast(this))); + } else { + static_assert(std::is_base_of_v, "Type must be derived from SharedCacheable"); + Cache::store(std::static_pointer_cast(this->shared_from_this())); + } } }; class ThreadLocalCache { template - static Stack>& local_stack() + static auto& local_stack_sp() { static thread_local Stack> stack; return stack; } + template + static auto& local_stack_ip() + { + static thread_local Stack> stack; + return stack; + } + public: template static void store(std::shared_ptr&& _what) { - local_stack().push(std::move(_what)); + local_stack_sp().push(std::move(_what)); + } + + template + static void store(IntrusivePtr&& _what) + { + local_stack_ip().push(std::move(_what)); } template - static auto load() + static auto load_sp() { - auto& ls = local_stack(); + auto& ls = local_stack_sp(); if (ls.empty()) { return std::shared_ptr{}; } else { @@ -131,6 +223,19 @@ class ThreadLocalCache { return ret; } } + + template + static auto load_ip() + { + auto& ls = local_stack_ip(); + if (ls.empty()) { + return IntrusivePtr{}; + } else { + auto ret(std::move(ls.top())); + ls.pop(); + return ret; + } + } }; } // namespace solid diff --git a/solid/utility/cast.hpp b/solid/utility/cast.hpp new file mode 100644 index 00000000..85695ced --- /dev/null +++ b/solid/utility/cast.hpp @@ -0,0 +1,41 @@ +// solid/utility/cast.hpp +// +// Copyright (c) 2024 Valentin Palade (vipalade @ gmail . com) +// +// This file is part of SolidFrame framework. +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. +// +#pragma once + +#include "solid/utility/innerlist.hpp" +#include + +namespace solid { + +template +inline std::shared_ptr static_pointer_cast(const std::shared_ptr& r) noexcept +{ + return std::static_pointer_cast(r); +} + +template +inline std::shared_ptr static_pointer_cast(std::shared_ptr&& r) noexcept +{ + return std::static_pointer_cast(std::move(r)); +} + +template +inline std::shared_ptr dynamic_pointer_cast(const std::shared_ptr& r) noexcept +{ + return std::dynamic_pointer_cast(r); +} + +template +inline std::shared_ptr dynamic_pointer_cast(std::shared_ptr&& r) noexcept +{ + return std::dynamic_pointer_cast(std::move(r)); +} + +} // namespace solid \ No newline at end of file diff --git a/solid/utility/collapse.hpp b/solid/utility/collapse.hpp new file mode 100644 index 00000000..fe56c6db --- /dev/null +++ b/solid/utility/collapse.hpp @@ -0,0 +1,33 @@ +// solid/utility/collapse.hpp +// +// Copyright (c) 2024 Valentin Palade (vipalade @ gmail . com) +// +// This file is part of SolidFrame framework. +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. +// +#pragma once +#include "solid/utility/intrusiveptr.hpp" +#include "solid/utility/sharedbuffer.hpp" +#include "solid/utility/typetraits.hpp" + +namespace solid { + +#ifdef __cpp_concepts +template +concept Collapsable = std::is_same_v || is_intrusive_ptr_v; + +template +#else +template +#endif +inline auto collapse(Ptr& _rptr) +{ + if (_rptr.collapse()) { + return Ptr(std::move(_rptr)); + } + return Ptr(); +} + +} // namespace solid \ No newline at end of file diff --git a/solid/utility/intrusiveptr.hpp b/solid/utility/intrusiveptr.hpp new file mode 100644 index 00000000..3d08df98 --- /dev/null +++ b/solid/utility/intrusiveptr.hpp @@ -0,0 +1,276 @@ +// solid/utility/intrusiveptr.hpp +// +// Copyright (c) 2024 Valentin Palade (vipalade @ gmail . com) +// +// This file is part of SolidFrame framework. +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. +// +#pragma once + +#include +#include + +namespace solid { + +class IntrusiveThreadSafePolicy; + +class IntrusiveThreadSafeBase { + mutable std::atomic_size_t use_count_{0}; + +public: + size_t useCount() const noexcept + { + return use_count_.load(std::memory_order_relaxed); + } + +private: + friend class IntrusiveThreadSafePolicy; + void acquire() const noexcept + { + ++use_count_; + } + bool release() const noexcept + { + return use_count_.fetch_sub(1) == 1; + } +}; + +namespace impl { +template +auto make_policy_intrusive(const P& _policy, Args&&... _args); +} + +class IntrusiveThreadSafePolicy { +protected: + void acquire(const IntrusiveThreadSafeBase& _rt) const noexcept + { + _rt.acquire(); + } + + auto release(const IntrusiveThreadSafeBase& _rt) const noexcept + { + return _rt.release(); + } + auto useCount(const IntrusiveThreadSafeBase& _rt) const noexcept + { + return _rt.useCount(); + } +}; + +template +class IntrusivePtr : public Policy { + T* ptr_ = nullptr; + +public: + using element_type = T; + IntrusivePtr() = default; + + IntrusivePtr(const IntrusivePtr& _other) + : ptr_(_other.ptr_) + { + if (ptr_) { + Policy::acquire(*ptr_); + } + } + + IntrusivePtr(IntrusivePtr&& _other) + : ptr_(_other.detach()) + { + } + + template + IntrusivePtr(const IntrusivePtr& _other) + : ptr_(_other.get()) + { + if (ptr_) { + Policy::acquire(*ptr_); + } + } + + template + IntrusivePtr(IntrusivePtr&& _other) + : ptr_(_other.detach()) + { + } + + template + friend class IntrusivePtr; + + ~IntrusivePtr() + { + if (ptr_ && Policy::release(*ptr_)) { + delete ptr_; + } + } + + IntrusivePtr& operator=(const IntrusivePtr& _other) noexcept + { + IntrusivePtr{_other}.swap(*this); + return *this; + } + IntrusivePtr& operator=(IntrusivePtr&& _other) noexcept + { + IntrusivePtr{std::move(_other)}.swap(*this); + return *this; + } + + template + IntrusivePtr& operator=(const IntrusivePtr& _other) noexcept + { + IntrusivePtr{_other}.swap(*this); + return *this; + } + template + IntrusivePtr& operator=(IntrusivePtr&& _other) noexcept + { + IntrusivePtr{std::move(_other)}.swap(*this); + return *this; + } + + T* get() const noexcept + { + return ptr_; + } + + T* detach() noexcept + { + T* ret = ptr_; + ptr_ = nullptr; + return ret; + } + + T& operator*() const noexcept + { + return *ptr_; + } + + T* operator->() const noexcept + { + return ptr_; + } + + explicit operator bool() const noexcept + { + return ptr_ != nullptr; + } + + void reset() + { + if (ptr_) { + if (Policy::release(*ptr_)) { + delete ptr_; + } + ptr_ = nullptr; + } + } + + void swap(IntrusivePtr& _other) noexcept + { + T* tmp = ptr_; + ptr_ = _other.ptr_; + _other.ptr_ = tmp; + } + + size_t useCount() const noexcept + { + if (ptr_ != nullptr) [[likely]] { + return Policy::useCount(*ptr_); + } + return 0; + } + + bool collapse() + { + if (ptr_) { + if (Policy::release(*ptr_)) { + Policy::acquire(*ptr_); + return true; + } + ptr_ = nullptr; + } + return false; + } + +private: + template + friend auto make_intrusive(Args&&... _args); + template + friend auto impl::make_policy_intrusive(const PP&, Args&&... _args); + template + friend IntrusivePtr static_pointer_cast(const IntrusivePtr& _rp) noexcept; + template + friend IntrusivePtr dynamic_pointer_cast(const IntrusivePtr& _rp) noexcept; + template + friend IntrusivePtr static_pointer_cast(IntrusivePtr&& _rp) noexcept; + template + friend IntrusivePtr dynamic_pointer_cast(IntrusivePtr&& _rp) noexcept; + template + friend class EnableCacheable; + + IntrusivePtr(T* _ptr) + : ptr_(_ptr) + { + if (_ptr) { + Policy::acquire(*_ptr); + } + } + + IntrusivePtr(const Policy& _policy, T* _ptr) + : Policy(_policy) + , ptr_(_ptr) + { + if (_ptr) { + Policy::acquire(*_ptr); + } + } +}; + +namespace impl { +template +auto make_policy_intrusive(const P& _policy, Args&&... _args) +{ + return IntrusivePtr(_policy, new T(std::forward(_args)...)); +} +} // namespace impl +template +auto make_intrusive(Args&&... _args) +{ + if constexpr (std::is_base_of_v) { + return IntrusivePtr(new T(std::forward(_args)...)); + } else { + return impl::make_policy_intrusive(std::forward(_args)...); + } +} + +template +IntrusivePtr static_pointer_cast(const IntrusivePtr& _rp) noexcept +{ + return IntrusivePtr(static_cast(_rp.get())); +} + +template +IntrusivePtr static_pointer_cast(IntrusivePtr&& _rp) noexcept +{ + return IntrusivePtr(static_cast(_rp.detach())); +} + +template +IntrusivePtr dynamic_pointer_cast(const IntrusivePtr& _rp) noexcept +{ + return IntrusivePtr(dynamic_cast(_rp.get())); +} + +template +IntrusivePtr dynamic_pointer_cast(IntrusivePtr&& _rp) noexcept +{ + auto* pt = dynamic_cast(_rp.get()); + if (pt) { + _rp.detach(); + return IntrusivePtr(pt); + } + return IntrusivePtr(); +} + +} // namespace solid \ No newline at end of file diff --git a/solid/utility/sharedbuffer.hpp b/solid/utility/sharedbuffer.hpp index 3355d3bd..aedaf44f 100644 --- a/solid/utility/sharedbuffer.hpp +++ b/solid/utility/sharedbuffer.hpp @@ -2,12 +2,18 @@ #include #include +#include + +#include "solid/system/common.hpp" +#include "solid/system/pimpl.hpp" namespace solid { class SharedBuffer { struct Data { std::atomic use_count_; + std::thread::id make_thread_id_; + Data* pnext_ = nullptr; std::size_t size_ = 0; std::size_t capacity_ = 0; char* buffer_; @@ -30,17 +36,12 @@ class SharedBuffer { return *this; } - char* release(); + char* release(size_t& _previous_use_count); char* data() { return data_; } - - std::size_t capacity() const - { - return capacity_ + (data_ - buffer_); - } }; static Data sentinel; @@ -48,6 +49,7 @@ class SharedBuffer { Data* pdata_; friend SharedBuffer make_shared_buffer(const std::size_t); + friend class BufferManager; static Data* allocate_data(const std::size_t _cap); @@ -56,6 +58,8 @@ class SharedBuffer { { } + SharedBuffer(const std::size_t _cap, const std::thread::id& _thr_id); + public: explicit operator bool() const noexcept { @@ -96,6 +100,13 @@ class SharedBuffer { return pdata_->capacity_; } + std::size_t actualCapacity() const; + + auto makerThreadId() const + { + return pdata_->make_thread_id_; + } + void append(const std::size_t _size) { pdata_->size_ += _size; @@ -116,19 +127,22 @@ class SharedBuffer { return pdata_->use_count_.load(); } - void reset() + size_t reset() { + size_t previous_use_count = 0; if (*this) { - auto buf = pdata_->release(); + auto buf = pdata_->release(previous_use_count); delete[] buf; pdata_ = &sentinel; } + return previous_use_count; } - bool revive() + bool collapse() { if (*this) { - auto buf = pdata_->release(); + size_t previous_use_count = 0; + auto buf = pdata_->release(previous_use_count); if (buf) { pdata_->acquire(); return true; @@ -167,4 +181,36 @@ inline SharedBuffer make_shared_buffer(const std::size_t _cap) return SharedBuffer(_cap); } +class BufferManager : NonCopyable { + friend class SharedBuffer; + struct Data; + PimplT pimpl_; + static char* release(SharedBuffer::Data* _pdata); + static SharedBuffer::Data* allocate(const size_t _cap); + +public: + struct LocalData; + + struct Configuration { + size_t default_local_max_count_ = 0; + }; + + static BufferManager& instance(const Configuration* _pconfig = nullptr); + + inline static SharedBuffer make(const size_t _cap) + { + return SharedBuffer{_cap, std::this_thread::get_id()}; + } + + static void localMaxCount(const size_t _cap, const size_t _count); + static size_t localMaxCount(const size_t _cap); + static size_t localCount(const size_t _cap); + + static const Configuration& configuration(); + +private: + BufferManager(const Configuration& _config); + ~BufferManager(); +}; + } // namespace solid \ No newline at end of file diff --git a/solid/utility/src/sharedbuffer.cpp b/solid/utility/src/sharedbuffer.cpp index f3209efb..3a3e06ef 100644 --- a/solid/utility/src/sharedbuffer.cpp +++ b/solid/utility/src/sharedbuffer.cpp @@ -1,38 +1,192 @@ #include "solid/utility/sharedbuffer.hpp" #include +#include namespace solid { SharedBuffer::Data SharedBuffer::sentinel; -char* SharedBuffer::Data::release() +char* SharedBuffer::Data::release(size_t& _previous_use_count) { - if (use_count_.fetch_sub(1) == 1) { - return buffer_; + if ((_previous_use_count = use_count_.fetch_sub(1)) == 1) { + if (make_thread_id_ == std::thread::id{}) { + return buffer_; + } else { + return BufferManager::release(this); + } } return nullptr; } - -inline constexpr std::size_t compute_capacity(const std::size_t _cap, const std::size_t _size_of_data) +namespace { +template +inline constexpr std::size_t compute_capacity(const std::size_t _cap) { constexpr std::size_t allign = 256; - const std::size_t sum = (_cap + _size_of_data); + const std::size_t sum = (_cap + DataSize); + + static_assert(allign >= DataSize); + if ((sum % allign) == 0) { return sum; } else { return (sum - (sum % allign)) + allign; } } +} // namespace /* static */ SharedBuffer::Data* SharedBuffer::allocate_data(const std::size_t _cap) { - const std::size_t new_cap = compute_capacity(_cap, sizeof(Data)); + const std::size_t new_cap = compute_capacity(_cap); auto pbuf = new char[new_cap]; auto pdata = new (pbuf) Data{pbuf}; - pdata->capacity_ = (pbuf + new_cap) - pdata->data(); + pdata->capacity_ = _cap; //(pbuf + new_cap) - pdata->data(); return pdata; } +SharedBuffer::SharedBuffer(const std::size_t _cap, const std::thread::id& _thr_id) +{ + pdata_ = BufferManager::allocate(_cap); + if (pdata_ == nullptr) [[unlikely]] { + const std::size_t new_cap = compute_capacity(_cap); + char* pbuf = new char[new_cap]; + pdata_ = new (pbuf) Data{pbuf}; + pdata_->capacity_ = _cap; //(pbuf + new_cap) - pdata_->data(); + } + pdata_->make_thread_id_ = _thr_id; +} + +std::size_t SharedBuffer::actualCapacity() const +{ + const std::size_t new_cap = compute_capacity(pdata_->capacity_); + return (pdata_->buffer_ + new_cap) - pdata_->data(); +} + +//----------------------------------------------------------------------------- + +struct BufferManager::LocalData { + struct Entry { + SharedBuffer::Data* ptop_ = nullptr; + size_t max_count_ = BufferManager::configuration().default_local_max_count_; + size_t count_ = 0; + + inline bool empty() const noexcept + { + return ptop_ == nullptr; + } + + inline bool full() const noexcept + { + return max_count_ != 0 && count_ >= max_count_; + } + + inline SharedBuffer::Data* pop() noexcept + { + if (!empty()) { + auto* ptmp = ptop_; + ptop_ = ptop_->pnext_; + --count_; + return ptmp; + } + return nullptr; + } + + inline void push(SharedBuffer::Data* _pnode) noexcept + { + if (_pnode) { + _pnode->pnext_ = ptop_; + ptop_ = _pnode; + ++count_; + } + } + }; + + using CapacityMapT = std::unordered_map; + CapacityMapT entry_map_; +}; + +namespace { + +thread_local BufferManager::LocalData local_data; + +} // namespace + +struct BufferManager::Data { + const Configuration config_; + + Data(const BufferManager::Configuration& _config) + : config_(_config) + { + } +}; + +BufferManager::BufferManager(const BufferManager::Configuration& _config) + : pimpl_{make_pimpl(_config)} +{ +} + +BufferManager::~BufferManager() {} + +/* static */ BufferManager& BufferManager::instance(const BufferManager::Configuration* _pconfig) +{ + static const Configuration cfg; + static BufferManager ins{_pconfig ? *_pconfig : cfg}; + return ins; +} + +/* static */ char* BufferManager::release(SharedBuffer::Data* _pdata) +{ + if (_pdata) { + if (_pdata->make_thread_id_ == std::this_thread::get_id()) { + const std::size_t new_cap = compute_capacity(_pdata->capacity_); + auto& entry = local_data.entry_map_[new_cap]; + + if (!entry.full()) { + entry.push(_pdata); + return nullptr; + } + } + return _pdata->buffer_; + } + return nullptr; +} + +/* static */ SharedBuffer::Data* BufferManager::allocate(const size_t _cap) +{ + const std::size_t new_cap = compute_capacity(_cap); + auto& entry = local_data.entry_map_[new_cap]; + auto* pdata = entry.pop(); + if (pdata) { + pdata->use_count_.store(1); + pdata->size_ = 0; + pdata->pnext_ = nullptr; + pdata->capacity_ = _cap; + } + return pdata; +} + +/* static */ void BufferManager::localMaxCount(const size_t _cap, const size_t _count) +{ + const std::size_t new_cap = compute_capacity(_cap); + local_data.entry_map_[new_cap].max_count_ = _count; +} + +/* static */ size_t BufferManager::localMaxCount(const size_t _cap) +{ + const std::size_t new_cap = compute_capacity(_cap); + return local_data.entry_map_[new_cap].max_count_; +} + +/* static */ size_t BufferManager::localCount(const size_t _cap) +{ + const std::size_t new_cap = compute_capacity(_cap); + return local_data.entry_map_[new_cap].count_; +} + +/* static */ const BufferManager::Configuration& BufferManager::configuration() +{ + return instance().pimpl_->config_; +} + } // namespace solid \ No newline at end of file diff --git a/solid/utility/test/CMakeLists.txt b/solid/utility/test/CMakeLists.txt index 5aa202d5..afb951c9 100644 --- a/solid/utility/test/CMakeLists.txt +++ b/solid/utility/test/CMakeLists.txt @@ -20,6 +20,8 @@ set( UtilityTestSuite test_function_any_speed_full_solid.cpp test_function_any_speed_full_stl.cpp test_shared_buffer.cpp + test_collapse.cpp + test_intrusiveptr.cpp ) set( ThreadPoolTestSuite @@ -75,6 +77,11 @@ add_test(NAME TestUtilityCallPoolMulticastPattern COMMAND test_utility te add_test(NAME TestUtilityCallPoolMulticastSynchCtxBasic COMMAND test_utility test_threadpool_multicast_synchronization_context_basic) add_test(NAME TestUtilityFunctionPerf_s_2_10000_1000 COMMAND test_utility test_function_perf s 2 10000 1000) add_test(NAME TestUtilityFunctionPerf_S_2_10000_1000 COMMAND test_utility test_function_perf S 2 10000 1000) +add_test(NAME TestUtilitySharedBuffer COMMAND test_utility test_shared_buffer) +add_test(NAME TestCollapse_B COMMAND test_utility test_collapse B) +add_test(NAME TestCollapse_p COMMAND test_utility test_collapse p 10 4) +add_test(NAME TestCollapse_b COMMAND test_utility test_collapse b 10 4) +add_test(NAME TestIntrusivePtr COMMAND test_utility test_intrusiveptr) add_test(NAME TestThreadPoolThreadContext COMMAND test_threadpool test_threadpool_thread_context) add_test(NAME TestThreadPoolContext COMMAND test_threadpool test_threadpool_context) add_test(NAME TestThreadPoolPattern COMMAND test_threadpool test_threadpool_pattern) diff --git a/solid/utility/test/test_callpool_multicast_basic.cpp b/solid/utility/test/test_callpool_multicast_basic.cpp index de77c496..c1e525f6 100644 --- a/solid/utility/test/test_callpool_multicast_basic.cpp +++ b/solid/utility/test/test_callpool_multicast_basic.cpp @@ -118,7 +118,7 @@ int test_callpool_multicast_basic(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } diff --git a/solid/utility/test/test_callpool_multicast_pattern.cpp b/solid/utility/test/test_callpool_multicast_pattern.cpp index 6549a777..7aae8e76 100644 --- a/solid/utility/test/test_callpool_multicast_pattern.cpp +++ b/solid/utility/test/test_callpool_multicast_pattern.cpp @@ -80,7 +80,7 @@ int test_callpool_multicast_pattern(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } diff --git a/solid/utility/test/test_collapse.cpp b/solid/utility/test/test_collapse.cpp new file mode 100644 index 00000000..8ea93fcd --- /dev/null +++ b/solid/utility/test/test_collapse.cpp @@ -0,0 +1,185 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "solid/system/exception.hpp" +#include "solid/system/log.hpp" +#include "solid/utility/collapse.hpp" +#include "solid/utility/threadpool.hpp" +using namespace std; +using namespace solid; +namespace { + +#ifdef SOLID_ON_LINUX +vector isolcpus = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 17, 18, 19}; + +void set_current_thread_affinity() +{ + static std::atomic crtCore(0); + + const int isolCore = isolcpus[crtCore.fetch_add(1) % isolcpus.size()]; + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + CPU_SET(isolCore, &cpuset); + int rc = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + // solid_check(rc == 0); + (void)rc; +} +#else +void set_current_thread_affinity() +{ +} +#endif + +struct Message : IntrusiveThreadSafeBase { + string text_; + + Message() + { + solid_log(generic_logger, Info, "Create Message " << this << " count " << this->useCount()); + } + ~Message() + { + solid_log(generic_logger, Info, "Destroy Message " << this << " count " << this->useCount()); + } +}; + +using CallPoolT = ThreadPool, Function>; +using SharedMessageT = IntrusivePtr; +} // namespace + +int test_collapse(int argc, char* argv[]) +{ + solid::log_start(std::cerr, {".*:VIEWXS"}); + + char choice = 'B'; // B = basic, p = speed shared_ptr, b = speed SharedBuffer + size_t repeat_count = 100; + size_t thread_count = 10; + + if (argc > 1) { + choice = *argv[1]; + } + + if (argc > 2) { + repeat_count = stoul(argv[2]); + } + + if (argc > 3) { + thread_count = stoul(argv[3]); + } + + if (choice == 'B') { + for (size_t i = 0; i < repeat_count; ++i) { + std::promise ready_promise; + std::shared_future ready_future(ready_promise.get_future()); + std::promise p; + auto f = p.get_future(); + auto sm = make_intrusive(); + vector thr_vec; + { + auto lambda = [&p, ready_future](SharedMessageT _sm) mutable { + set_current_thread_affinity(); + // ready_future.wait(); + + if (auto tmp_sm = collapse(_sm)) { + p.set_value(std::move(tmp_sm)); + } + }; + + auto sm_lock{std::move(sm)}; + for (size_t i = 0; i < thread_count; ++i) { + thr_vec.emplace_back(lambda, sm); + } + + ready_promise.set_value(); + + if (auto tmp_sm = collapse(sm_lock)) { + p.set_value(std::move(tmp_sm)); + } + } + for (auto& t : thr_vec) { + t.join(); + } + { + if (f.wait_for(chrono::seconds(5)) != future_status::ready) { + solid_throw("Waited for too long"); + } + sm = f.get(); + cout << "done " << sm.get() << " use count = " << sm.useCount() << endl; + solid_check(sm.useCount() == 1); + } + } + } else if (choice == 'p') { + CallPoolT wp{thread_count, 10000, 100, + [](const size_t) { + set_current_thread_affinity(); + }, + [](const size_t) {}}; + auto sm = make_intrusive(); + const auto start_time = chrono::high_resolution_clock::now(); + for (size_t i = 0; i < repeat_count; ++i) { + std::promise p; + auto f = p.get_future(); + auto sm_lock{std::move(sm)}; + wp.pushAll( + [&p, sm_lock]() mutable { + if (auto tmp_sm = collapse(sm_lock)) { + solid_dbg(generic_logger, Info, "" << this_thread::get_id() << " sm_lock.count = " << sm_lock.useCount()); + p.set_value(std::move(tmp_sm)); + } + }); + + if (auto tmp_sm = collapse(sm_lock)) { + solid_dbg(generic_logger, Info, "" << this_thread::get_id() << " sm_lock.count = " << sm_lock.useCount()); + p.set_value(std::move(tmp_sm)); + } + { + if (f.wait_for(chrono::seconds(5)) != future_status::ready) { + solid_throw("Waited for too long"); + } + sm = f.get(); + solid_check(sm.useCount() == 1); + } + } + const auto stop_time = chrono::high_resolution_clock::now(); + cout << "Duration: " << chrono::duration_cast(stop_time - start_time).count() << "us" << endl; + } else if (choice == 'b') { + CallPoolT wp{thread_count, 10000, 100, + [](const size_t) { + set_current_thread_affinity(); + }, + [](const size_t) {}}; + auto sm = make_shared_buffer(100); + const auto start_time = chrono::high_resolution_clock::now(); + for (size_t i = 0; i < repeat_count; ++i) { + std::promise p; + auto f = p.get_future(); + auto sm_lock{std::move(sm)}; + wp.pushAll( + [&p, sm_lock]() mutable { + if (auto tmp_sm = collapse(sm_lock)) { + p.set_value(std::move(tmp_sm)); + } + }); + if (auto tmp_sm = collapse(sm_lock)) { + p.set_value(std::move(tmp_sm)); + } + { + if (f.wait_for(chrono::seconds(5)) != future_status::ready) { + solid_throw("Waited for too long"); + } + sm = f.get(); + solid_check(sm.useCount() == 1); + } + } + const auto stop_time = chrono::high_resolution_clock::now(); + cout << "Duration: " << chrono::duration_cast(stop_time - start_time).count() << "us" << endl; + } else { + cout << "Invalid choice. Expected B or p or b. Got [" << choice << "]." << endl; + } + return 0; +} diff --git a/solid/utility/test/test_intrusiveptr.cpp b/solid/utility/test/test_intrusiveptr.cpp new file mode 100644 index 00000000..6858a3e7 --- /dev/null +++ b/solid/utility/test/test_intrusiveptr.cpp @@ -0,0 +1,111 @@ +#include "solid/system/cassert.hpp" +#include "solid/system/exception.hpp" +#include "solid/utility/intrusiveptr.hpp" +#include + +using namespace solid; +using namespace std; + +namespace { + +struct Test : IntrusiveThreadSafeBase { + string s_; + int i_ = 0; + + Test(const string_view _s, const int _i) + : s_(_s) + , i_(_i) + { + } +}; + +struct TestFirst : Test { + size_t sz_ = 0; + + TestFirst(const size_t _sz, const string_view _s, const int _i) + : Test(_s, _i) + , sz_(_sz) + { + } +}; + +struct TestWithCounter { + string s_; + int i_ = 0; + + TestWithCounter(const string_view _s, const int _i) + : s_(_s) + , i_(_i) + { + } + +private: + friend class TestIntrusivePolicy; + mutable atomic use_count_{0}; +}; + +class TestIntrusivePolicy { +protected: + void acquire(const TestWithCounter& _p) noexcept + { + ++_p.use_count_; + } + bool release(const TestWithCounter& _p) noexcept + { + return _p.use_count_.fetch_sub(1) == 1; + } + size_t useCount(const TestWithCounter& _p) const noexcept + { + return _p.use_count_.load(std::memory_order_relaxed); + } +}; + +} // namespace + +int test_intrusiveptr(int argc, char* argvp[]) +{ + Test t{"ceva", 10}; + auto test_ptr = make_intrusive("ceva", 10); + auto twc_ptr = make_intrusive(TestIntrusivePolicy{}, "ceva2", 11); + + cout << "sizeof(test_ptr): " << sizeof(test_ptr) << endl; + cout << "sizeof(twc_ptr): " << sizeof(twc_ptr) << endl; + + { + IntrusivePtr ptr; + + ptr = test_ptr; + solid_check(ptr.useCount() == 2); + } + solid_check(test_ptr.useCount() == 1); + { + IntrusivePtr ptr{test_ptr}; + + solid_check(ptr.useCount() == 2); + } + solid_check(test_ptr.useCount() == 1); + { + IntrusivePtr ptr{std::move(test_ptr)}; + + solid_check(ptr.useCount() == 1); + test_ptr = std::move(ptr); + } + solid_check(test_ptr.useCount() == 1); + { + IntrusivePtr ptr; + ptr = std::move(test_ptr); + + solid_check(ptr.useCount() == 1); + test_ptr = std::move(ptr); + } + solid_check(test_ptr.useCount() == 1); + + auto first_ptr = make_intrusive(111UL, "ceva", 10); + + { + IntrusivePtr ptr{static_pointer_cast(first_ptr)}; + + solid_check(ptr && ptr.useCount() == 2); + } + return 0; +} \ No newline at end of file diff --git a/solid/utility/test/test_shared_buffer.cpp b/solid/utility/test/test_shared_buffer.cpp index fd75e8c7..679c52d0 100644 --- a/solid/utility/test/test_shared_buffer.cpp +++ b/solid/utility/test/test_shared_buffer.cpp @@ -1,37 +1,107 @@ #include "solid/system/exception.hpp" #include "solid/utility/sharedbuffer.hpp" +#include #include +#include +#include using namespace std; using namespace solid; int test_shared_buffer(int argc, char* argv[]) { - SharedBuffer sb = make_shared_buffer(1000); + { + SharedBuffer sb = make_shared_buffer(1000); - cout << sb.capacity() << endl; - cout << sb.size() << endl; + cout << sb.capacity() << endl; + cout << sb.size() << endl; - sb.resize(100); + sb.resize(100); - solid_check(sb.size() == 100); + solid_check(sb.size() == 100); - SharedBuffer sb2 = sb; + SharedBuffer sb2 = sb; - solid_check(sb2.size() == 100); + solid_check(sb2.size() == 100); - for (size_t i = 8; i <= 1024; i += 8) { - SharedBuffer sb = make_shared_buffer(i); - cout << i << "\t" << sb.capacity() << endl; + SharedBuffer sb3 = sb2; // sb3 == sb2 + + solid_check(!sb2.collapse()); + solid_check(!sb.collapse()); + + solid_check(sb3.collapse()); + solid_check(sb3); } + { + std::promise p; + std::future f = p.get_future(); + + vector thr_vec; + void* psb1 = nullptr; + { + + SharedBuffer sb1 = BufferManager::make(1000); + SharedBuffer sb2 = BufferManager::make(2000); + + cout << static_cast(sb1.data()) << endl; + cout << static_cast(sb2.data()) << endl; + + psb1 = sb1.data(); - SharedBuffer sb3 = sb2; // sb3 == sb2 + solid_check(psb1); - solid_check(!sb2.revive()); - solid_check(!sb.revive()); + auto lambda = [&p, sb1, sb2]() mutable { + this_thread::sleep_for(chrono::milliseconds(200)); + if (sb1.collapse()) { + p.set_value(std::move(sb1)); + } + if (sb2.collapse()) { + sb2.reset(); + solid_check(!sb2); + solid_check(BufferManager::localCount(2000) == 0); + } + }; - solid_check(sb3.revive()); - solid_check(sb3); + for (size_t i = 0; i < 4; ++i) { + thr_vec.emplace_back(lambda); + } + if (sb1.collapse()) { + p.set_value(std::move(sb1)); + } + } + + for (auto& t : thr_vec) { + t.join(); + } + solid_check(BufferManager::localCount(1000) == 0); + { + auto sb = f.get(); + + cout << static_cast(sb.data()) << endl; + solid_check(psb1 == static_cast(sb.data())); + } + solid_check(BufferManager::localCount(1000) == 1); + { + SharedBuffer sb1 = BufferManager::make(1000); + cout << static_cast(sb1.data()) << endl; + solid_check(BufferManager::localCount(1000) == 0); + solid_check(psb1 == static_cast(sb1.data())); + } + solid_check(BufferManager::localCount(1000) == 1); + } + + for (size_t i = 100; i < 4000; i += 100) { + SharedBuffer sb1 = make_shared_buffer(i); + SharedBuffer sb2 = BufferManager::make(i); + solid_check(sb1.capacity() == i); + solid_check(sb2.capacity() == i); + cout << i << " " << sb1.capacity() << " " << sb1.actualCapacity() << " " << sb2.capacity() << " " << sb2.actualCapacity() << endl; + } + { + SharedBuffer empty_buf; + solid_check(empty_buf.capacity() == 0); + cout << "Empty buffer actualCapacity = " << empty_buf.actualCapacity() << endl; + } return 0; } \ No newline at end of file diff --git a/solid/utility/test/test_threadpool.cpp b/solid/utility/test/test_threadpool.cpp index 1d0ad796..a05a4cdb 100644 --- a/solid/utility/test/test_threadpool.cpp +++ b/solid/utility/test/test_threadpool.cpp @@ -136,7 +136,7 @@ int test_threadpool(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(generic_logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(generic_logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } this_thread::sleep_for(chrono::seconds(12)); diff --git a/solid/utility/test/test_threadpool_basic.cpp b/solid/utility/test/test_threadpool_basic.cpp index 72c14991..46bc7763 100644 --- a/solid/utility/test/test_threadpool_basic.cpp +++ b/solid/utility/test/test_threadpool_basic.cpp @@ -60,7 +60,7 @@ int test_threadpool_basic(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } diff --git a/solid/utility/test/test_threadpool_chain.cpp b/solid/utility/test/test_threadpool_chain.cpp index 45f1d02f..bd1b4782 100644 --- a/solid/utility/test/test_threadpool_chain.cpp +++ b/solid/utility/test/test_threadpool_chain.cpp @@ -75,7 +75,7 @@ int test_threadpool_chain(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } diff --git a/solid/utility/test/test_threadpool_multicast_basic.cpp b/solid/utility/test/test_threadpool_multicast_basic.cpp index d39a30e1..041cab0b 100644 --- a/solid/utility/test/test_threadpool_multicast_basic.cpp +++ b/solid/utility/test/test_threadpool_multicast_basic.cpp @@ -102,7 +102,7 @@ int test_threadpool_multicast_basic(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } diff --git a/solid/utility/test/test_threadpool_multicast_sleep.cpp b/solid/utility/test/test_threadpool_multicast_sleep.cpp index c2103151..4d96a322 100644 --- a/solid/utility/test/test_threadpool_multicast_sleep.cpp +++ b/solid/utility/test/test_threadpool_multicast_sleep.cpp @@ -101,7 +101,7 @@ int test_threadpool_multicast_sleep(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } diff --git a/solid/utility/test/test_threadpool_pattern.cpp b/solid/utility/test/test_threadpool_pattern.cpp index eba82aa1..6c13c032 100644 --- a/solid/utility/test/test_threadpool_pattern.cpp +++ b/solid/utility/test/test_threadpool_pattern.cpp @@ -96,7 +96,7 @@ int test_threadpool_pattern(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } diff --git a/solid/utility/test/test_threadpool_thread_context.cpp b/solid/utility/test/test_threadpool_thread_context.cpp index c8f517a6..39e22043 100644 --- a/solid/utility/test/test_threadpool_thread_context.cpp +++ b/solid/utility/test/test_threadpool_thread_context.cpp @@ -85,7 +85,7 @@ int test_threadpool_thread_context(int argc, char* argv[]) }; pwp = nullptr; - solid_log(logger, Verbose, "completed all pushes - wating for workpool to terminate: " << chrono::duration(chrono::steady_clock::now() - start).count()); + solid_log(logger, Verbose, "completed all pushes - wating for ThreadPool to terminate: " << chrono::duration(chrono::steady_clock::now() - start).count()); } solid_log(logger, Verbose, "after done: " << chrono::duration(chrono::steady_clock::now() - start).count()); solid_check(v == val, "val = " << val << " v = " << v); @@ -96,9 +96,9 @@ int test_threadpool_thread_context(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } - solid_log(logger, Error, "Waited too much. Wait some more for workpool internal checkpoints to fire..."); + solid_log(logger, Error, "Waited too much. Wait some more for ThreadPool internal checkpoints to fire..."); this_thread::sleep_for(chrono::seconds(100)); solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); diff --git a/solid/utility/test/test_threadpool_try.cpp b/solid/utility/test/test_threadpool_try.cpp index 41be6f40..1f28a58f 100644 --- a/solid/utility/test/test_threadpool_try.cpp +++ b/solid/utility/test/test_threadpool_try.cpp @@ -64,7 +64,7 @@ int test_threadpool_try(int argc, char* argv[]) auto fut = async(launch::async, lambda); if (fut.wait_for(chrono::seconds(wait_seconds)) != future_status::ready) { if (pwp != nullptr) { - solid_log(logger, Statistic, "Workpool statistic: " << pwp.load()->statistic()); + solid_log(logger, Statistic, "ThreadPool statistic: " << pwp.load()->statistic()); } solid_throw(" Test is taking too long - waited " << wait_seconds << " secs"); } diff --git a/solid/utility/threadpool.hpp b/solid/utility/threadpool.hpp index 86ffe932..789fb1cb 100644 --- a/solid/utility/threadpool.hpp +++ b/solid/utility/threadpool.hpp @@ -346,7 +346,6 @@ class ThreadPool : NonCopyable { using TaskQueueT = TaskList; std::atomic_size_t use_count_{1}; std::atomic_uint_fast64_t produce_id_{0}; - ContextStub* pnext_ = nullptr; SpinLock spin_; TaskQueueT task_q_; alignas(hardware_destructive_interference_size) std::atomic_uint_fast64_t consume_id_{0}; @@ -1099,14 +1098,16 @@ void ThreadPool::doRun( rstub.clear(); rstub.notifyWhilePop(); - consumeAll(local_context, all_id, _all_fnc, std::forward(_args)...); - if (pctx == nullptr) { + consumeAll(local_context, all_id, _all_fnc, std::forward(_args)...); + _one_fnc(task, std::forward(_args)...); ++local_context.one_free_count_; statistic_.runOneFreeCount(local_context.one_free_count_); continue; } else if (context_produce_id == pctx->consume_id_.load(std::memory_order_relaxed)) { + consumeAll(local_context, all_id, _all_fnc, std::forward(_args)...); + _one_fnc(task, std::forward(_args)...); ++local_one_context_count; } else { @@ -1119,6 +1120,9 @@ void ThreadPool::doRun( continue; } else { pctx->spin_.unlock(); + + consumeAll(local_context, all_id, _all_fnc, std::forward(_args)...); + _one_fnc(task, std::forward(_args)...); ++local_one_context_count; } @@ -1136,6 +1140,7 @@ void ThreadPool::doRun( break; } } + consumeAll(local_context, all_id, _all_fnc, std::forward(_args)...); _one_fnc(task_data.task(), std::forward(_args)...); @@ -1173,7 +1178,7 @@ bool ThreadPool::tryConsumeAnAllTask(std::atomic_uint8_ { auto& rstub = all_.tasks_[_rlocal_context.next_all_id_ % all_.capacity_]; if (rstub.isFilled(_rlocal_context.next_all_id_)) { - // NOTE: first we fetch the commited_all_index than we check if the + // NOTE: first we fetch the commited_all_index then we check if the // current stub is reserved (some thread is starting to push something) // - this is to ensure that we are not processing an all task prior to being // used by any one task. This is guranteed because when adding a new one task, @@ -1188,7 +1193,7 @@ bool ThreadPool::tryConsumeAnAllTask(std::atomic_uint8_ return false; // will wait on lock } - if (_rlocal_context.next_all_id_ > commited_all_index) { + if (overflow_safe_less(commited_all_index, _rlocal_context.next_all_id_)) { cpu_pause(); return true; } @@ -1264,13 +1269,13 @@ void ThreadPool::doPushAll(Tsk&& _task) rstub.task(std::forward(_task)); - const auto shoud_wake_threads = all_.pending_count_.fetch_add(1) == 0; + const auto should_wake_threads = all_.pending_count_.fetch_add(1) == 0; rstub.notifyWhilePushAll(static_cast(threads_.size()), id); commitAllId(id); - if (shoud_wake_threads) { + if (should_wake_threads) { for (size_t i = 0; i < threads_.size(); ++i) { auto& rstub = one_.tasks_[pushOneIndex()]; @@ -1281,7 +1286,7 @@ void ThreadPool::doPushAll(Tsk&& _task) rstub.notifyWhilePushAll(); } } - statistic_.pushAll(shoud_wake_threads); + statistic_.pushAll(should_wake_threads); } //----------------------------------------------------------------------------- template diff --git a/solid/utility/typetraits.hpp b/solid/utility/typetraits.hpp index b0b7ae8b..c6530510 100644 --- a/solid/utility/typetraits.hpp +++ b/solid/utility/typetraits.hpp @@ -1,6 +1,7 @@ #pragma once +#include "solid/utility/intrusiveptr.hpp" #include #include #include @@ -101,12 +102,23 @@ template struct is_shared_ptr> : std::true_type { }; +template +struct is_intrusive_ptr : std::false_type { +}; + +template +struct is_intrusive_ptr> : std::true_type { +}; + template inline constexpr bool is_unique_ptr_v = is_unique_ptr::value; template inline constexpr bool is_shared_ptr_v = is_shared_ptr::value; +template +inline constexpr bool is_intrusive_ptr_v = is_intrusive_ptr::value; + template struct is_bitset : std::false_type { }; diff --git a/tutorials/mprpc_echo/README.md b/tutorials/mprpc_echo/README.md index f5f4301b..09a601e8 100644 --- a/tutorials/mprpc_echo/README.md +++ b/tutorials/mprpc_echo/README.md @@ -125,7 +125,7 @@ AioSchedulerT scheduler; frame::Manager manager; frame::mprpc::ServiceT ipcservice(manager); -CallPool cwp{WorkPoolConfiguration(1)}; +CallPool cwp{ThreadPoolConfiguration(1)}; frame::aio::Resolver resolver(cwp); ErrorConditionT err; @@ -179,8 +179,8 @@ namespace ipc_echo_client{ template void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rerror) { @@ -325,8 +325,8 @@ namespace ipc_echo_server{ template void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(not _rerror); diff --git a/tutorials/mprpc_echo/mprpc_echo_client.cpp b/tutorials/mprpc_echo/mprpc_echo_client.cpp index 34dcacda..df926ce6 100644 --- a/tutorials/mprpc_echo/mprpc_echo_client.cpp +++ b/tutorials/mprpc_echo/mprpc_echo_client.cpp @@ -36,10 +36,10 @@ namespace rpc_echo_client { template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { if (_rerror) { cout << "Error sending message to " << _rctx.recipientName() << ". Error: " << _rerror.message() << endl; @@ -110,7 +110,7 @@ int main(int argc, char* argv[]) size_t offset = line.find(' '); if (offset != string::npos) { recipient = line.substr(0, offset); - rpcservice.sendMessage(recipient.c_str(), make_shared(line.substr(offset + 1)), {frame::mprpc::MessageFlagsE::AwaitResponse}); + rpcservice.sendMessage(recipient.c_str(), frame::mprpc::make_message(line.substr(offset + 1)), {frame::mprpc::MessageFlagsE::AwaitResponse}); } else { cout << "No recipient specified. E.g:" << endl << "localhost:4444 Some text to send" << endl; diff --git a/tutorials/mprpc_echo/mprpc_echo_client_pool.cpp b/tutorials/mprpc_echo/mprpc_echo_client_pool.cpp index 1fb59c4d..7e4e6a7c 100644 --- a/tutorials/mprpc_echo/mprpc_echo_client_pool.cpp +++ b/tutorials/mprpc_echo/mprpc_echo_client_pool.cpp @@ -38,10 +38,10 @@ namespace rpc_echo_client { template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { if (_rerror) { cout << "Error sending message to " << _rctx.recipientName() << ". Error: " << _rerror.message() << endl; @@ -117,7 +117,7 @@ int main(int argc, char* argv[]) if (line == "q" || line == "Q" || line == "quit") { break; } - rpcservice.sendMessage(recipient_id, make_shared(std::move(line)), {frame::mprpc::MessageFlagsE::AwaitResponse}); + rpcservice.sendMessage(recipient_id, frame::mprpc::make_message(std::move(line)), {frame::mprpc::MessageFlagsE::AwaitResponse}); } } return 0; diff --git a/tutorials/mprpc_echo/mprpc_echo_server.cpp b/tutorials/mprpc_echo/mprpc_echo_server.cpp index 57388bdc..53f43b0e 100644 --- a/tutorials/mprpc_echo/mprpc_echo_server.cpp +++ b/tutorials/mprpc_echo/mprpc_echo_server.cpp @@ -36,10 +36,10 @@ namespace rpc_echo_server { template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); diff --git a/tutorials/mprpc_echo_relay/README.md b/tutorials/mprpc_echo_relay/README.md index 7f6b932d..8f5e042c 100644 --- a/tutorials/mprpc_echo_relay/README.md +++ b/tutorials/mprpc_echo_relay/README.md @@ -128,8 +128,8 @@ where con_register is a lambda defined as follows: ```C++ auto con_register = []( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); @@ -151,8 +151,8 @@ The "on_message" in protocol initialization code snippet is also a lambda, defin ```C++ auto on_message = [&p]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { @@ -295,8 +295,8 @@ next follows a new block for configuring the mprpc::Service: { auto con_register = [&relay_engine]( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr) { diff --git a/tutorials/mprpc_echo_relay/mprpc_echo_relay_client.cpp b/tutorials/mprpc_echo_relay/mprpc_echo_relay_client.cpp index d29b7f6a..680d2ae9 100644 --- a/tutorials/mprpc_echo_relay/mprpc_echo_relay_client.cpp +++ b/tutorials/mprpc_echo_relay/mprpc_echo_relay_client.cpp @@ -78,10 +78,10 @@ int main(int argc, char* argv[]) { auto con_register = []( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) { + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr && _rrecv_msg_ptr->name.empty()) { @@ -93,10 +93,10 @@ int main(int argc, char* argv[]) } }; auto on_message = [&p]( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) { + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { if (_rrecv_msg_ptr) { cout << _rrecv_msg_ptr->name << ": " << _rrecv_msg_ptr->data << endl; if (!_rsent_msg_ptr) { @@ -111,7 +111,7 @@ int main(int argc, char* argv[]) auto on_connection_start = [&p](frame::mprpc::ConnectionContext& _rctx) { solid_log(generic_logger, Info, _rctx.recipientId()); - auto msgptr = std::make_shared(p.name); + auto msgptr = frame::mprpc::make_message(p.name); ErrorConditionT err = _rctx.service().sendMessage(_rctx.recipientId(), std::move(msgptr), {frame::mprpc::MessageFlagsE::AwaitResponse}); solid_check(!err, "failed send Register"); }; @@ -150,7 +150,7 @@ int main(int argc, char* argv[]) size_t offset = line.find(' '); if (offset != string::npos) { recipient = p.server_addr + '/' + line.substr(0, offset); - rpcservice.sendMessage(recipient.c_str(), make_shared(p.name, line.substr(offset + 1)), {frame::mprpc::MessageFlagsE::AwaitResponse}); + rpcservice.sendMessage(recipient.c_str(), frame::mprpc::make_message(p.name, line.substr(offset + 1)), {frame::mprpc::MessageFlagsE::AwaitResponse}); } else { cout << "No recipient name specified. E.g:" << endl << "alpha Some text to send" << endl; diff --git a/tutorials/mprpc_echo_relay/mprpc_echo_relay_server.cpp b/tutorials/mprpc_echo_relay/mprpc_echo_relay_server.cpp index 695ec295..72dd7047 100644 --- a/tutorials/mprpc_echo_relay/mprpc_echo_relay_server.cpp +++ b/tutorials/mprpc_echo_relay/mprpc_echo_relay_server.cpp @@ -57,10 +57,10 @@ int main(int argc, char* argv[]) { auto con_register = [&relay_engine]( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) { + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); if (_rrecv_msg_ptr) { solid_check(!_rsent_msg_ptr); diff --git a/tutorials/mprpc_file/README.md b/tutorials/mprpc_file/README.md index 29c09108..0b6fe2c8 100644 --- a/tutorials/mprpc_file/README.md +++ b/tutorials/mprpc_file/README.md @@ -261,7 +261,7 @@ AioSchedulerT scheduler; frame::Manager manager; frame::mprpc::ServiceT ipcservice(manager); -CallPool cwp{WorkPoolConfiguration(1)}; +CallPool cwp{ThreadPoolConfiguration(1)}; frame::aio::Resolver resolver(cwp); ErrorConditionT err; @@ -304,8 +304,8 @@ namespace ipc_file_client{ template void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(false); //this method should not be called @@ -360,8 +360,8 @@ while(true){ recipient.c_str(), make_shared(std::move(path)), []( frame::mprpc::ConnectionContext &_rctx, - std::shared_ptr &_rsent_msg_ptr, - std::shared_ptr &_rrecv_msg_ptr, + frame::mprpc::MessagePointerT &_rsent_msg_ptr, + frame::mprpc::MessagePointerT &_rrecv_msg_ptr, ErrorConditionT const &_rerror ){ if(_rerror){ @@ -394,8 +394,8 @@ while(true){ recipient.c_str(), make_shared(std::move(remote_path), std::move(local_path)), []( frame::mprpc::ConnectionContext &_rctx, - std::shared_ptr &_rsent_msg_ptr, - std::shared_ptr &_rrecv_msg_ptr, + frame::mprpc::MessagePointerT &_rsent_msg_ptr, + frame::mprpc::MessagePointerT &_rrecv_msg_ptr, ErrorConditionT const &_rerror ){ if(_rerror){ @@ -501,15 +501,15 @@ namespace ipc_file_server{ template void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); template <> void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(not _rerror); @@ -540,8 +540,8 @@ void complete_message( template <> void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(not _rerror); @@ -552,8 +552,8 @@ void complete_message( template <> void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(not _rerror); @@ -574,8 +574,8 @@ void complete_message( template <> void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(not _rerror); diff --git a/tutorials/mprpc_file/mprpc_file_client.cpp b/tutorials/mprpc_file/mprpc_file_client.cpp index b87c03e0..23efb7b4 100644 --- a/tutorials/mprpc_file/mprpc_file_client.cpp +++ b/tutorials/mprpc_file/mprpc_file_client.cpp @@ -36,10 +36,10 @@ namespace rpc_file_client { template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(false); // this method should not be called } @@ -141,12 +141,12 @@ int main(int argc, char* argv[]) iss >> path; rpcservice.sendRequest( - recipient.c_str(), make_shared(std::move(path)), + recipient.c_str(), frame::mprpc::make_message(std::move(path)), []( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) { + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { if (_rerror) { cout << "Error sending message to " << _rctx.recipientName() << ". Error: " << _rerror.message() << endl; return; @@ -173,12 +173,12 @@ int main(int argc, char* argv[]) iss >> remote_path >> local_path; rpcservice.sendRequest( - recipient.c_str(), make_shared(std::move(remote_path), std::move(local_path)), + recipient.c_str(), frame::mprpc::make_message(std::move(remote_path), std::move(local_path)), []( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) { + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { if (_rerror) { cout << "Error sending message to " << _rctx.recipientName() << ". Error: " << _rerror.message() << endl; return; diff --git a/tutorials/mprpc_file/mprpc_file_messages.hpp b/tutorials/mprpc_file/mprpc_file_messages.hpp index 642d3be8..1a01b6f7 100644 --- a/tutorials/mprpc_file/mprpc_file_messages.hpp +++ b/tutorials/mprpc_file/mprpc_file_messages.hpp @@ -124,7 +124,7 @@ struct FileResponse : solid::frame::mprpc::Message { private: const std::string* localPath(solid::frame::mprpc::ConnectionContext& _rctx) const { - auto req_ptr = std::dynamic_pointer_cast(_rctx.fetchRequest(*this)); + auto req_ptr = solid::dynamic_pointer_cast(_rctx.fetchRequest(*this)); if (req_ptr) { return &req_ptr->local_path; } diff --git a/tutorials/mprpc_file/mprpc_file_server.cpp b/tutorials/mprpc_file/mprpc_file_server.cpp index 132244d9..6326e627 100644 --- a/tutorials/mprpc_file/mprpc_file_server.cpp +++ b/tutorials/mprpc_file/mprpc_file_server.cpp @@ -44,23 +44,23 @@ namespace rpc_file_server { template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror); + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror); template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(_rrecv_msg_ptr); solid_check(!_rsent_msg_ptr); - auto msgptr = std::make_shared(*_rrecv_msg_ptr); + auto msgptr = frame::mprpc::make_message(*_rrecv_msg_ptr); fs::path fs_path(_rrecv_msg_ptr->path.c_str() /*, fs::native*/); @@ -83,10 +83,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(!_rrecv_msg_ptr); @@ -95,16 +95,16 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(_rrecv_msg_ptr); solid_check(!_rsent_msg_ptr); - auto msgptr = std::make_shared(*_rrecv_msg_ptr); + auto msgptr = frame::mprpc::make_message(*_rrecv_msg_ptr); if ((false)) { error_code error; @@ -117,10 +117,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(!_rrecv_msg_ptr); diff --git a/tutorials/mprpc_request/README.md b/tutorials/mprpc_request/README.md index 9105cf7f..c928ba8c 100644 --- a/tutorials/mprpc_request/README.md +++ b/tutorials/mprpc_request/README.md @@ -155,7 +155,7 @@ AioSchedulerT scheduler; frame::Manager manager; frame::mprpc::ServiceT ipcservice(manager); -CallPool cwp{WorkPoolConfiguration(1)}; +CallPool cwp{ThreadPoolConfiguration(1)}; frame::aio::Resolver resolver(cwp); ErrorConditionT err; @@ -197,8 +197,8 @@ namespace ipc_request_client{ template void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(false); //this method should not be called @@ -239,8 +239,8 @@ while(true){ auto lambda = []( frame::mprpc::ConnectionContext &_rctx, - std::shared_ptr &_rsent_msg_ptr, - std::shared_ptr &_rrecv_msg_ptr, + frame::mprpc::MessagePointerT &_rsent_msg_ptr, + frame::mprpc::MessagePointerT &_rrecv_msg_ptr, ErrorConditionT const &_rerror ){ if(_rerror){ @@ -331,15 +331,15 @@ namespace ipc_request_server{ template void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror); template <> void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(not _rerror); @@ -362,8 +362,8 @@ void complete_message( template <> void complete_message( frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, ErrorConditionT const& _rerror) { solid_check(not _rerror); diff --git a/tutorials/mprpc_request/mprpc_request_client.cpp b/tutorials/mprpc_request/mprpc_request_client.cpp index 2ed83ea8..b0689710 100644 --- a/tutorials/mprpc_request/mprpc_request_client.cpp +++ b/tutorials/mprpc_request/mprpc_request_client.cpp @@ -36,10 +36,10 @@ namespace rpc_request_client { template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(false); // this method should not be called } @@ -127,10 +127,10 @@ int main(int argc, char* argv[]) if (offset != string::npos) { recipient = line.substr(0, offset); auto lambda = []( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) { + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { if (_rerror) { cout << "Error sending message to " << _rctx.recipientName() << ". Error: " << _rerror.message() << endl; return; @@ -145,7 +145,7 @@ int main(int argc, char* argv[]) } }; - auto req_ptr = make_shared(line.substr(offset + 1)); + auto req_ptr = frame::mprpc::make_message(line.substr(offset + 1)); rpcservice.sendRequest( recipient.c_str(), req_ptr, lambda, 0); diff --git a/tutorials/mprpc_request/mprpc_request_server.cpp b/tutorials/mprpc_request/mprpc_request_server.cpp index faa236b7..5f0af569 100644 --- a/tutorials/mprpc_request/mprpc_request_server.cpp +++ b/tutorials/mprpc_request/mprpc_request_server.cpp @@ -87,23 +87,23 @@ namespace rpc_request_server { template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror); + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror); template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(_rrecv_msg_ptr); solid_check(!_rsent_msg_ptr); - auto msgptr = std::make_shared(*_rrecv_msg_ptr); + auto msgptr = frame::mprpc::make_message(*_rrecv_msg_ptr); std::regex userid_regex(_rrecv_msg_ptr->userid_regex); @@ -118,10 +118,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(!_rrecv_msg_ptr); diff --git a/tutorials/mprpc_request_ssl/mprpc_request_client.cpp b/tutorials/mprpc_request_ssl/mprpc_request_client.cpp index 506e5270..9a1ce092 100644 --- a/tutorials/mprpc_request_ssl/mprpc_request_client.cpp +++ b/tutorials/mprpc_request_ssl/mprpc_request_client.cpp @@ -52,10 +52,10 @@ using namespace rpc_request; template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(false); // this method should not be called } @@ -156,10 +156,10 @@ int main(int argc, char* argv[]) recipient = line.substr(0, offset); auto lambda = []( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) { + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { if (_rerror) { cout << "Error sending message to " << _rctx.recipientName() << ". Error: " << _rerror.message() << endl; return; @@ -174,7 +174,7 @@ int main(int argc, char* argv[]) } }; - auto req_ptr = make_shared( + auto req_ptr = frame::mprpc::make_message( make_shared( make_shared( make_shared(line.substr(offset + 1)), @@ -189,7 +189,7 @@ int main(int argc, char* argv[]) cout << endl; rpcservice.sendRequest( - recipient.c_str(), // make_shared(line.substr(offset + 1)), + recipient.c_str(), // frame::mprpc::make_message(line.substr(offset + 1)), req_ptr, lambda, 0); } else { cout << "No recipient specified. E.g:" << endl diff --git a/tutorials/mprpc_request_ssl/mprpc_request_server.cpp b/tutorials/mprpc_request_ssl/mprpc_request_server.cpp index 63f4d091..e16cdb3e 100644 --- a/tutorials/mprpc_request_ssl/mprpc_request_server.cpp +++ b/tutorials/mprpc_request_ssl/mprpc_request_server.cpp @@ -99,10 +99,10 @@ namespace rpc_request_server { template void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror); + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror); using namespace rpc_request; @@ -248,10 +248,10 @@ struct AccountDataKeyVisitor : RequestKeyConstVisitor { template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(_rrecv_msg_ptr); @@ -263,7 +263,7 @@ void complete_message( } cout << endl; - auto msgptr = std::make_shared(*_rrecv_msg_ptr); + auto msgptr = frame::mprpc::make_message(*_rrecv_msg_ptr); if (_rrecv_msg_ptr->key) { PrepareKeyVisitor prep; @@ -286,10 +286,10 @@ void complete_message( template <> void complete_message( - frame::mprpc::ConnectionContext& _rctx, - std::shared_ptr& _rsent_msg_ptr, - std::shared_ptr& _rrecv_msg_ptr, - ErrorConditionT const& _rerror) + frame::mprpc::ConnectionContext& _rctx, + frame::mprpc::MessagePointerT& _rsent_msg_ptr, + frame::mprpc::MessagePointerT& _rrecv_msg_ptr, + ErrorConditionT const& _rerror) { solid_check(!_rerror); solid_check(!_rrecv_msg_ptr);