fixed race condition

This commit is contained in:
orignal 2014-10-06 12:50:36 -04:00
parent 0f3a68cd8e
commit 7fb93ca853
3 changed files with 29 additions and 10 deletions

View File

@ -243,6 +243,7 @@ namespace tunnel
Tunnel * Tunnels::GetPendingTunnel (uint32_t replyMsgID) Tunnel * Tunnels::GetPendingTunnel (uint32_t replyMsgID)
{ {
std::unique_lock<std::mutex> l(m_PendingTunnelsMutex);
auto it = m_PendingTunnels.find(replyMsgID); auto it = m_PendingTunnels.find(replyMsgID);
if (it != m_PendingTunnels.end () && it->second->GetState () == eTunnelStatePending) if (it != m_PendingTunnels.end () && it->second->GetState () == eTunnelStatePending)
{ {
@ -299,6 +300,11 @@ namespace tunnel
{ {
if (pool) if (pool)
{ {
{
std::unique_lock<std::mutex> l(m_PendingTunnelsMutex);
for (auto it: m_PendingTunnels)
if (it.second->GetTunnelPool () == pool) it.second->SetTunnelPool (nullptr);
}
std::unique_lock<std::mutex> l(m_PoolsMutex); std::unique_lock<std::mutex> l(m_PoolsMutex);
m_Pools.erase (pool->GetIdentHash ()); m_Pools.erase (pool->GetIdentHash ());
delete pool; delete pool;
@ -374,9 +380,19 @@ namespace tunnel
} }
void Tunnels::ManageTunnels () void Tunnels::ManageTunnels ()
{
ManagePendingTunnels ();
ManageInboundTunnels ();
ManageOutboundTunnels ();
ManageTransitTunnels ();
ManageTunnelPools ();
}
void Tunnels::ManagePendingTunnels ()
{ {
// check pending tunnel. delete failed or timeout // check pending tunnel. delete failed or timeout
uint64_t ts = i2p::util::GetSecondsSinceEpoch (); uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
std::unique_lock<std::mutex> l(m_PendingTunnelsMutex);
for (auto it = m_PendingTunnels.begin (); it != m_PendingTunnels.end ();) for (auto it = m_PendingTunnels.begin (); it != m_PendingTunnels.end ();)
{ {
auto tunnel = it->second; auto tunnel = it->second;
@ -405,12 +421,7 @@ namespace tunnel
it = m_PendingTunnels.erase (it); it = m_PendingTunnels.erase (it);
} }
} }
}
ManageInboundTunnels ();
ManageOutboundTunnels ();
ManageTransitTunnels ();
ManageTunnelPools ();
}
void Tunnels::ManageOutboundTunnels () void Tunnels::ManageOutboundTunnels ()
{ {

View File

@ -139,6 +139,7 @@ namespace tunnel
void ManageOutboundTunnels (); void ManageOutboundTunnels ();
void ManageInboundTunnels (); void ManageInboundTunnels ();
void ManageTransitTunnels (); void ManageTransitTunnels ();
void ManagePendingTunnels ();
void ManageTunnelPools (); void ManageTunnelPools ();
void CreateZeroHopsInboundTunnel (); void CreateZeroHopsInboundTunnel ();
@ -147,6 +148,7 @@ namespace tunnel
bool m_IsRunning; bool m_IsRunning;
std::thread * m_Thread; std::thread * m_Thread;
std::mutex m_PendingTunnelsMutex;
std::map<uint32_t, Tunnel *> m_PendingTunnels; // by replyMsgID std::map<uint32_t, Tunnel *> m_PendingTunnels; // by replyMsgID
std::mutex m_InboundTunnelsMutex; std::mutex m_InboundTunnelsMutex;
std::map<uint32_t, InboundTunnel *> m_InboundTunnels; std::map<uint32_t, InboundTunnel *> m_InboundTunnels;

View File

@ -17,10 +17,16 @@ namespace tunnel
TunnelPool::~TunnelPool () TunnelPool::~TunnelPool ()
{ {
for (auto it: m_InboundTunnels) {
it->SetTunnelPool (nullptr); std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
for (auto it: m_OutboundTunnels) for (auto it: m_InboundTunnels)
it->SetTunnelPool (nullptr); it->SetTunnelPool (nullptr);
}
{
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
for (auto it: m_OutboundTunnels)
it->SetTunnelPool (nullptr);
}
} }
void TunnelPool::TunnelCreated (InboundTunnel * createdTunnel) void TunnelPool::TunnelCreated (InboundTunnel * createdTunnel)