mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 04:04:16 +00:00
fixed race condition
This commit is contained in:
parent
a527dcd95b
commit
03f0ca965e
@ -68,8 +68,7 @@ namespace data
|
|||||||
dest->SetRequestComplete (requestComplete);
|
dest->SetRequestComplete (requestComplete);
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
|
||||||
if (!m_RequestedDestinations.insert (std::make_pair (destination,
|
if (!m_RequestedDestinations.insert (std::make_pair (destination, dest)).second) // not inserted
|
||||||
std::shared_ptr<RequestedDestination> (dest))).second) // not inserted
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return dest;
|
return dest;
|
||||||
@ -77,20 +76,28 @@ namespace data
|
|||||||
|
|
||||||
void NetDbRequests::RequestComplete (const IdentHash& ident, std::shared_ptr<RouterInfo> r)
|
void NetDbRequests::RequestComplete (const IdentHash& ident, std::shared_ptr<RouterInfo> r)
|
||||||
{
|
{
|
||||||
auto it = m_RequestedDestinations.find (ident);
|
std::shared_ptr<RequestedDestination> request;
|
||||||
if (it != m_RequestedDestinations.end ())
|
{
|
||||||
{
|
|
||||||
if (r)
|
|
||||||
it->second->Success (r);
|
|
||||||
else
|
|
||||||
it->second->Fail ();
|
|
||||||
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
|
||||||
m_RequestedDestinations.erase (it);
|
auto it = m_RequestedDestinations.find (ident);
|
||||||
|
if (it != m_RequestedDestinations.end ())
|
||||||
|
{
|
||||||
|
request = it->second;
|
||||||
|
m_RequestedDestinations.erase (it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (request)
|
||||||
|
{
|
||||||
|
if (r)
|
||||||
|
request->Success (r);
|
||||||
|
else
|
||||||
|
request->Fail ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<RequestedDestination> NetDbRequests::FindRequest (const IdentHash& ident) const
|
std::shared_ptr<RequestedDestination> NetDbRequests::FindRequest (const IdentHash& ident) const
|
||||||
{
|
{
|
||||||
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
|
||||||
auto it = m_RequestedDestinations.find (ident);
|
auto it = m_RequestedDestinations.find (ident);
|
||||||
if (it != m_RequestedDestinations.end ())
|
if (it != m_RequestedDestinations.end ())
|
||||||
return it->second;
|
return it->second;
|
||||||
|
@ -59,7 +59,7 @@ namespace data
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::mutex m_RequestedDestinationsMutex;
|
mutable std::mutex m_RequestedDestinationsMutex;
|
||||||
std::map<IdentHash, std::shared_ptr<RequestedDestination> > m_RequestedDestinations;
|
std::map<IdentHash, std::shared_ptr<RequestedDestination> > m_RequestedDestinations;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user