diff --git a/libi2pd/Streaming.cpp b/libi2pd/Streaming.cpp index c59946a3..f4b61a2a 100644 --- a/libi2pd/Streaming.cpp +++ b/libi2pd/Streaming.cpp @@ -200,12 +200,10 @@ namespace stream } m_SendBuffer.CleanUp (); - while (!m_ReceiveQueue.empty ()) - { - auto packet = m_ReceiveQueue.front (); - m_ReceiveQueue.pop (); - delete packet; - } + + for (auto it: m_ReceiveQueue) + delete it; + m_ReceiveQueue.clear (); m_NACKedPackets.clear (); @@ -425,7 +423,7 @@ namespace stream size_t packetLength = packet->GetLength (); if (packetLength > 0) { - m_ReceiveQueue.push (packet); + m_ReceiveQueue.push_back (packet); if (m_SizeToReceive) { if (packetLength < m_SizeToReceive) @@ -1483,20 +1481,23 @@ namespace stream size_t Stream::ConcatenatePackets (uint8_t * buf, size_t len) { + if (m_ReceiveQueue.empty ()) return 0; size_t pos = 0; - while (pos < len && !m_ReceiveQueue.empty ()) + auto it = m_ReceiveQueue.begin (); + while (pos < len && it != m_ReceiveQueue.end ()) { - Packet * packet = m_ReceiveQueue.front (); + Packet * packet = *it; size_t l = std::min (packet->GetLength (), len - pos); memcpy (buf + pos, packet->GetBuffer (), l); pos += l; packet->offset += l; if (!packet->GetLength ()) { - m_ReceiveQueue.pop (); m_LocalDestination.DeletePacket (packet); + it++; } } + m_ReceiveQueue.erase (m_ReceiveQueue.begin (), it); return pos; } diff --git a/libi2pd/Streaming.h b/libi2pd/Streaming.h index 85616c9f..24b68a11 100644 --- a/libi2pd/Streaming.h +++ b/libi2pd/Streaming.h @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -293,7 +292,7 @@ namespace stream std::shared_ptr m_CurrentRemoteLease; std::shared_ptr m_NextRemoteLease; std::shared_ptr m_CurrentOutboundTunnel; - std::queue m_ReceiveQueue; + std::list m_ReceiveQueue; size_t m_SizeToReceive; // before invoke AsyncReceive handler std::set m_SavedPackets; std::list m_SentPackets;