From 5afdab59cbc2cc72acba9b508d3745ce0c467a6f Mon Sep 17 00:00:00 2001 From: Dominik Durner Date: Fri, 19 Apr 2024 14:49:37 +0200 Subject: [PATCH] Release sendReceiver during destructor of handle --- include/network/tasked_send_receiver.hpp | 4 +++- src/network/tasked_send_receiver.cpp | 29 ++++++++++++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/include/network/tasked_send_receiver.hpp b/include/network/tasked_send_receiver.hpp index 7929fd4..72eed0e 100644 --- a/include/network/tasked_send_receiver.hpp +++ b/include/network/tasked_send_receiver.hpp @@ -184,6 +184,8 @@ class TaskedSendReceiverHandle { TaskedSendReceiverHandle(TaskedSendReceiverHandle&& other); /// Move assignment TaskedSendReceiverHandle& operator=(TaskedSendReceiverHandle&& other); + /// Destructor + ~TaskedSendReceiverHandle(); /// Process group submissions (should be used for async requests) inline bool process(bool oneQueueInvocation = true) { return sendReceive(false, oneQueueInvocation); } @@ -192,7 +194,7 @@ class TaskedSendReceiverHandle { /// Adds a message to the submission queue bool sendSync(OriginalMessage* msg); /// Stops the handle thread if deamon - void stop(bool freeSendReceiver = true); + void stop(); /// Returns the underlying TaskedSendReceiver TaskedSendReceiver* get() { return _sendReceiver; } /// Returns the underlying TaskedSendReceiverGroup diff --git a/src/network/tasked_send_receiver.cpp b/src/network/tasked_send_receiver.cpp index 3f44b2d..e2ea42a 100644 --- a/src/network/tasked_send_receiver.cpp +++ b/src/network/tasked_send_receiver.cpp @@ -99,6 +99,22 @@ TaskedSendReceiverHandle& TaskedSendReceiverHandle::operator=(TaskedSendReceiver return *this; } //--------------------------------------------------------------------------- +TaskedSendReceiverHandle::~TaskedSendReceiverHandle() +// The destructor +{ + if (!_sendReceiver) + return; + auto ptr = _sendReceiver; + for (auto head = _group->_head.load();;) { + ptr->_next = head; + if (_group->_head.compare_exchange_weak(head, ptr)) { + return; + } + head = _group->_head; + } + _sendReceiver = nullptr; +} +//--------------------------------------------------------------------------- bool TaskedSendReceiverHandle::sendSync(OriginalMessage* msg) // Adds a message to the submission queue { @@ -108,23 +124,12 @@ bool TaskedSendReceiverHandle::sendSync(OriginalMessage* msg) return true; } //--------------------------------------------------------------------------- -void TaskedSendReceiverHandle::stop(bool freeSendReceiver) +void TaskedSendReceiverHandle::stop() // Stops the deamon { if (!_sendReceiver) return; _sendReceiver->stop(); - if (!freeSendReceiver) - return; - auto ptr = _sendReceiver; - for (auto head = _group->_head.load();;) { - ptr->_next = head; - if (_group->_head.compare_exchange_weak(head, ptr)) { - return; - } - head = _group->_head; - } - _sendReceiver = nullptr; } //--------------------------------------------------------------------------- bool TaskedSendReceiverHandle::sendReceive(bool local, bool oneQueueInvocation)