From 309822d93303234dd3bbb41bf04b4ccfea5ab98f Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 10 Aug 2017 20:29:35 -0400 Subject: [PATCH] teminate hadlers upon cleanup --- libi2pd_client/I2PService.cpp | 8 ++++++++ libi2pd_client/I2PService.h | 9 ++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libi2pd_client/I2PService.cpp b/libi2pd_client/I2PService.cpp index e3b85cb8..9348ec48 100644 --- a/libi2pd_client/I2PService.cpp +++ b/libi2pd_client/I2PService.cpp @@ -29,6 +29,14 @@ namespace client if (m_LocalDestination) m_LocalDestination->Release (); } + void I2PService::ClearHandlers () + { + std::unique_lock l(m_HandlersMutex); + for (auto it: m_Handlers) + it->Terminate (); + m_Handlers.clear(); + } + void I2PService::CreateStream (StreamRequestComplete streamRequestComplete, const std::string& dest, int port) { assert(streamRequestComplete); i2p::data::IdentHash identHash; diff --git a/libi2pd_client/I2PService.h b/libi2pd_client/I2PService.h index e0465d56..cf0cfd98 100644 --- a/libi2pd_client/I2PService.h +++ b/libi2pd_client/I2PService.h @@ -31,11 +31,7 @@ namespace client std::unique_lock l(m_HandlersMutex); m_Handlers.erase(conn); } - inline void ClearHandlers () - { - std::unique_lock l(m_HandlersMutex); - m_Handlers.clear(); - } + void ClearHandlers (); inline std::shared_ptr GetLocalDestination () { return m_LocalDestination; } inline std::shared_ptr GetLocalDestination () const { return m_LocalDestination; } @@ -66,6 +62,9 @@ namespace client virtual ~I2PServiceHandler() { } //If you override this make sure you call it from the children virtual void Handle() {}; //Start handling the socket + + void Terminate () { Kill (); }; + protected: // Call when terminating or handing over to avoid race conditions inline bool Kill () { return m_Dead.exchange(true); }