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); }