diff --git a/Tunnel.cpp b/Tunnel.cpp index 10e5de14..57887709 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -243,6 +243,7 @@ namespace tunnel Tunnel * Tunnels::GetPendingTunnel (uint32_t replyMsgID) { + std::unique_lock l(m_PendingTunnelsMutex); auto it = m_PendingTunnels.find(replyMsgID); if (it != m_PendingTunnels.end () && it->second->GetState () == eTunnelStatePending) { @@ -299,6 +300,11 @@ namespace tunnel { if (pool) { + { + std::unique_lock l(m_PendingTunnelsMutex); + for (auto it: m_PendingTunnels) + if (it.second->GetTunnelPool () == pool) it.second->SetTunnelPool (nullptr); + } std::unique_lock l(m_PoolsMutex); m_Pools.erase (pool->GetIdentHash ()); delete pool; @@ -374,9 +380,19 @@ namespace tunnel } void Tunnels::ManageTunnels () + { + ManagePendingTunnels (); + ManageInboundTunnels (); + ManageOutboundTunnels (); + ManageTransitTunnels (); + ManageTunnelPools (); + } + + void Tunnels::ManagePendingTunnels () { // check pending tunnel. delete failed or timeout uint64_t ts = i2p::util::GetSecondsSinceEpoch (); + std::unique_lock l(m_PendingTunnelsMutex); for (auto it = m_PendingTunnels.begin (); it != m_PendingTunnels.end ();) { auto tunnel = it->second; @@ -405,12 +421,7 @@ namespace tunnel it = m_PendingTunnels.erase (it); } } - - ManageInboundTunnels (); - ManageOutboundTunnels (); - ManageTransitTunnels (); - ManageTunnelPools (); - } + } void Tunnels::ManageOutboundTunnels () { diff --git a/Tunnel.h b/Tunnel.h index b62f4084..81ffebda 100644 --- a/Tunnel.h +++ b/Tunnel.h @@ -139,6 +139,7 @@ namespace tunnel void ManageOutboundTunnels (); void ManageInboundTunnels (); void ManageTransitTunnels (); + void ManagePendingTunnels (); void ManageTunnelPools (); void CreateZeroHopsInboundTunnel (); @@ -147,6 +148,7 @@ namespace tunnel bool m_IsRunning; std::thread * m_Thread; + std::mutex m_PendingTunnelsMutex; std::map m_PendingTunnels; // by replyMsgID std::mutex m_InboundTunnelsMutex; std::map m_InboundTunnels; diff --git a/TunnelPool.cpp b/TunnelPool.cpp index 4b7882d8..b6578323 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -17,10 +17,16 @@ namespace tunnel TunnelPool::~TunnelPool () { - for (auto it: m_InboundTunnels) - it->SetTunnelPool (nullptr); - for (auto it: m_OutboundTunnels) - it->SetTunnelPool (nullptr); + { + std::unique_lock l(m_InboundTunnelsMutex); + for (auto it: m_InboundTunnels) + it->SetTunnelPool (nullptr); + } + { + std::unique_lock l(m_OutboundTunnelsMutex); + for (auto it: m_OutboundTunnels) + it->SetTunnelPool (nullptr); + } } void TunnelPool::TunnelCreated (InboundTunnel * createdTunnel)