From 285e693a4e7b5b3a1a8e72a55bb78e60373542d4 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 17 May 2024 19:07:51 -0400 Subject: [PATCH] fixed deadlock --- libi2pd/TunnelPool.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/libi2pd/TunnelPool.cpp b/libi2pd/TunnelPool.cpp index 284a79c6..0a855350 100644 --- a/libi2pd/TunnelPool.cpp +++ b/libi2pd/TunnelPool.cpp @@ -365,15 +365,19 @@ namespace tunnel { it.second.second->SetState (eTunnelStateFailed); { - std::unique_lock l(m_InboundTunnelsMutex); - if (m_InboundTunnels.size () > 1 || m_NumInboundTunnels <= 1) // don't fail last tunnel - { - m_InboundTunnels.erase (it.second.second); - if (m_LocalDestination) - m_LocalDestination->SetLeaseSetUpdated (); - } - else - it.second.second->SetState (eTunnelStateTestFailed); + bool failed = false; + { + std::unique_lock l(m_InboundTunnelsMutex); + if (m_InboundTunnels.size () > 1 || m_NumInboundTunnels <= 1) // don't fail last tunnel + { + m_InboundTunnels.erase (it.second.second); + failed = true; + } + else + it.second.second->SetState (eTunnelStateTestFailed); + } + if (failed && m_LocalDestination) + m_LocalDestination->SetLeaseSetUpdated (); } if (m_LocalDestination) m_LocalDestination->SetLeaseSetUpdated ();