diff --git a/SSU.cpp b/SSU.cpp index 9dc05608..8f857bc5 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -187,14 +187,14 @@ namespace transport void SSUServer::Receive () { - SSUPacket * packet = new SSUPacket (); + SSUPacket * packet = m_Packets.AcquireMt (); m_Socket.async_receive_from (boost::asio::buffer (packet->buf, SSU_MTU_V4), packet->from, std::bind (&SSUServer::HandleReceivedFrom, this, std::placeholders::_1, std::placeholders::_2, packet)); } void SSUServer::ReceiveV6 () { - SSUPacket * packet = new SSUPacket (); + SSUPacket * packet = m_Packets.AcquireMt (); m_SocketV6.async_receive_from (boost::asio::buffer (packet->buf, SSU_MTU_V6), packet->from, std::bind (&SSUServer::HandleReceivedFromV6, this, std::placeholders::_1, std::placeholders::_2, packet)); } @@ -213,7 +213,7 @@ namespace transport { while (moreBytes && packets.size () < 25) { - packet = new SSUPacket (); + packet = m_Packets.AcquireMt (); packet->len = m_Socket.receive_from (boost::asio::buffer (packet->buf, SSU_MTU_V4), packet->from, 0, ec); if (!ec) { @@ -224,7 +224,7 @@ namespace transport else { LogPrint (eLogError, "SSU: receive_from error: ", ec.message ()); - delete packet; + m_Packets.ReleaseMt (packet); break; } } @@ -260,7 +260,7 @@ namespace transport { while (moreBytes && packets.size () < 25) { - packet = new SSUPacket (); + packet = m_Packets.AcquireMt (); packet->len = m_SocketV6.receive_from (boost::asio::buffer (packet->buf, SSU_MTU_V6), packet->from, 0, ec); if (!ec) { @@ -271,7 +271,7 @@ namespace transport else { LogPrint (eLogError, "SSU: v6 receive_from error: ", ec.message ()); - delete packet; + m_Packets.ReleaseMt (packet); break; } } @@ -282,7 +282,7 @@ namespace transport } else { - delete packet; + m_Packets.ReleaseMt (packet); if (ecode != boost::asio::error::operation_aborted) { LogPrint (eLogError, "SSU: v6 receive error: ", ecode.message ()); @@ -323,8 +323,8 @@ namespace transport if (session) session->FlushData (); session = nullptr; } - delete packet; } + m_Packets.ReleaseMt (packets); if (session) session->FlushData (); } diff --git a/SSU.h b/SSU.h index adbed739..9e873fcd 100644 --- a/SSU.h +++ b/SSU.h @@ -15,6 +15,7 @@ #include "RouterInfo.h" #include "I2NPProtocol.h" #include "SSUSession.h" +#include "util.h" // for MemoryPool namespace i2p { @@ -122,7 +123,8 @@ namespace transport std::map > m_Sessions, m_SessionsV6; std::map > m_Relays; // we are introducer std::map m_PeerTests; // nonce -> creation time in milliseconds - + i2p::util::MemoryPoolMt m_Packets; + public: // for HTTP only const decltype(m_Sessions)& GetSessions () const { return m_Sessions; };