From 9750fb73b5db15cc67d6b04b13f60a2713776c98 Mon Sep 17 00:00:00 2001 From: orignal Date: Sat, 4 Oct 2014 16:27:21 -0400 Subject: [PATCH] fixed race condition --- NetDb.cpp | 2 +- Streaming.cpp | 59 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/NetDb.cpp b/NetDb.cpp index 2517d1a7..411b381e 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -102,7 +102,7 @@ namespace data { try { - I2NPMessage * msg = m_Queue.GetNextWithTimeout (10000); // 10 sec + I2NPMessage * msg = m_Queue.GetNextWithTimeout (30000); // 30 sec if (msg) { while (msg) diff --git a/Streaming.cpp b/Streaming.cpp index f6e8bf41..3c445aeb 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -37,20 +37,25 @@ namespace stream } Stream::~Stream () - { - Close (); - m_ReceiveTimer.cancel (); - m_ResendTimer.cancel (); + { while (!m_ReceiveQueue.empty ()) { auto packet = m_ReceiveQueue.front (); m_ReceiveQueue.pop (); delete packet; - } - for (auto it: m_SavedPackets) - delete it; + } + m_ReceiveTimer.cancel (); + for (auto it: m_SentPackets) delete it; + m_SentPackets.clear (); + m_ResendTimer.cancel (); + + for (auto it: m_SavedPackets) + delete it; + m_SavedPackets.clear (); + + Close (); } void Stream::HandleNextPacket (Packet * packet) @@ -387,11 +392,14 @@ namespace stream if (packet) { SendPackets (std::vector { packet }); - bool isEmpty = m_SentPackets.empty (); - m_SentPackets.insert (packet); - if (isEmpty) - ScheduleResend (); - return true; + if (m_IsOpen) + { + bool isEmpty = m_SentPackets.empty (); + m_SentPackets.insert (packet); + if (isEmpty) + ScheduleResend (); + } + return true; } else return false; @@ -565,8 +573,12 @@ namespace stream StreamingDestination::~StreamingDestination () { - for (auto it: m_Streams) - delete it.second; + { + std::unique_lock l(m_StreamsMutex); + for (auto it: m_Streams) + delete it.second; + m_Streams.clear (); + } if (m_Pool) i2p::tunnel::tunnels.DeleteTunnelPool (m_Pool); delete m_LeaseSet; @@ -619,10 +631,14 @@ namespace stream void StreamingDestination::DeleteStream (Stream * stream) { if (stream) - { + { std::unique_lock l(m_StreamsMutex); - m_Streams.erase (stream->GetRecvStreamID ()); - delete stream; + auto it = m_Streams.find (stream->GetRecvStreamID ()); + if (it != m_Streams.end ()) + { + m_Streams.erase (it); + delete stream; + } } } @@ -738,9 +754,12 @@ namespace stream auto it = m_Destinations.find (destination->GetIdentHash ()); if (it != m_Destinations.end ()) { - delete it->second; - std::unique_lock l(m_DestinationsMutex); - m_Destinations.erase (it); + auto d = it->second; + { + std::unique_lock l(m_DestinationsMutex); + m_Destinations.erase (it); + } + delete d; } }