diff --git a/Garlic.cpp b/Garlic.cpp index ad33b38d..533d8310 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -323,7 +323,7 @@ namespace garlic void GarlicRouting::DeliveryStatusSent (GarlicRoutingSession * session, uint32_t msgID) { - std::unique_lock l(m_SessionsMutex); + std::unique_lock l(m_CreatedSessionsMutex); m_CreatedSessions[msgID] = session; } @@ -480,12 +480,15 @@ namespace garlic { I2NPDeliveryStatusMsg * deliveryStatus = (I2NPDeliveryStatusMsg *)msg->GetPayload (); uint32_t msgID = be32toh (deliveryStatus->msgID); - auto it = m_CreatedSessions.find (msgID); - if (it != m_CreatedSessions.end ()) { - it->second->SetAcknowledged (true); - m_CreatedSessions.erase (it); - LogPrint ("Garlic message ", msgID, " acknowledged"); + std::unique_lock l(m_CreatedSessionsMutex); + auto it = m_CreatedSessions.find (msgID); + if (it != m_CreatedSessions.end ()) + { + it->second->SetAcknowledged (true); + m_CreatedSessions.erase (it); + LogPrint ("Garlic message ", msgID, " acknowledged"); + } } DeleteI2NPMessage (msg); } diff --git a/Garlic.h b/Garlic.h index f66585a6..f6b3beab 100644 --- a/Garlic.h +++ b/Garlic.h @@ -125,6 +125,7 @@ namespace garlic // outgoing sessions std::mutex m_SessionsMutex; std::map m_Sessions; + std::mutex m_CreatedSessionsMutex; std::map m_CreatedSessions; // msgID -> session // incoming session // multiple tags refer to one decyption diff --git a/Tunnel.cpp b/Tunnel.cpp index cd05d9aa..4ffa700e 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -396,24 +396,27 @@ namespace tunnel void Tunnels::ManageOutboundTunnels () { uint64_t ts = i2p::util::GetSecondsSinceEpoch (); - for (auto it = m_OutboundTunnels.begin (); it != m_OutboundTunnels.end ();) { - if (ts > (*it)->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) + std::unique_lock l(m_OutboundTunnelsMutex); + for (auto it = m_OutboundTunnels.begin (); it != m_OutboundTunnels.end ();) { - LogPrint ("Tunnel ", (*it)->GetTunnelID (), " expired"); - auto pool = (*it)->GetTunnelPool (); - if (pool) - pool->TunnelExpired (*it); - delete *it; - it = m_OutboundTunnels.erase (it); - } - else - { - if ((*it)->IsEstablished () && ts + TUNNEL_EXPIRATION_THRESHOLD > (*it)->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) - (*it)->SetState (eTunnelStateExpiring); - it++; + if (ts > (*it)->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) + { + LogPrint ("Tunnel ", (*it)->GetTunnelID (), " expired"); + auto pool = (*it)->GetTunnelPool (); + if (pool) + pool->TunnelExpired (*it); + delete *it; + it = m_OutboundTunnels.erase (it); + } + else + { + if ((*it)->IsEstablished () && ts + TUNNEL_EXPIRATION_THRESHOLD > (*it)->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) + (*it)->SetState (eTunnelStateExpiring); + it++; + } } - } + } if (m_OutboundTunnels.size () < 5) { @@ -433,24 +436,27 @@ namespace tunnel void Tunnels::ManageInboundTunnels () { uint64_t ts = i2p::util::GetSecondsSinceEpoch (); - for (auto it = m_InboundTunnels.begin (); it != m_InboundTunnels.end ();) { - if (ts > it->second->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) + std::unique_lock l(m_InboundTunnelsMutex); + for (auto it = m_InboundTunnels.begin (); it != m_InboundTunnels.end ();) { - LogPrint ("Tunnel ", it->second->GetTunnelID (), " expired"); - auto pool = it->second->GetTunnelPool (); - if (pool) - pool->TunnelExpired (it->second); - delete it->second; - it = m_InboundTunnels.erase (it); - } - else - { - if (it->second->IsEstablished () && ts + TUNNEL_EXPIRATION_THRESHOLD > it->second->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) - it->second->SetState (eTunnelStateExpiring); - it++; + if (ts > it->second->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) + { + LogPrint ("Tunnel ", it->second->GetTunnelID (), " expired"); + auto pool = it->second->GetTunnelPool (); + if (pool) + pool->TunnelExpired (it->second); + delete it->second; + it = m_InboundTunnels.erase (it); + } + else + { + if (it->second->IsEstablished () && ts + TUNNEL_EXPIRATION_THRESHOLD > it->second->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT) + it->second->SetState (eTunnelStateExpiring); + it++; + } } - } + } if (m_InboundTunnels.empty ()) { @@ -516,6 +522,7 @@ namespace tunnel void Tunnels::AddOutboundTunnel (OutboundTunnel * newTunnel) { + std::unique_lock l(m_OutboundTunnelsMutex); m_OutboundTunnels.push_back (newTunnel); auto pool = newTunnel->GetTunnelPool (); if (pool) @@ -524,6 +531,7 @@ namespace tunnel void Tunnels::AddInboundTunnel (InboundTunnel * newTunnel) { + std::unique_lock l(m_InboundTunnelsMutex); m_InboundTunnels[newTunnel->GetTunnelID ()] = newTunnel; auto pool = newTunnel->GetTunnelPool (); if (!pool) diff --git a/Tunnel.h b/Tunnel.h index 705eebca..e1c0c253 100644 --- a/Tunnel.h +++ b/Tunnel.h @@ -148,7 +148,9 @@ namespace tunnel uint32_t m_NextReplyMsgID; // TODO: make it random later std::thread * m_Thread; std::map m_PendingTunnels; // by replyMsgID + std::mutex m_InboundTunnelsMutex; std::map m_InboundTunnels; + std::mutex m_OutboundTunnelsMutex; std::list m_OutboundTunnels; std::map m_TransitTunnels; std::map m_Pools;