diff --git a/HTTPServer.cpp b/HTTPServer.cpp
index 85dbec42..af9498c3 100644
--- a/HTTPServer.cpp
+++ b/HTTPServer.cpp
@@ -619,9 +619,9 @@ namespace util
s << "Transit tunnels:
\r\n
\r\n";
for (auto it: i2p::tunnel::tunnels.GetTransitTunnels ())
{
- if (dynamic_cast(it.second))
+ if (std::dynamic_pointer_cast(it.second))
s << it.second->GetTunnelID () << " ⇒ ";
- else if (dynamic_cast(it.second))
+ else if (std::dynamic_pointer_cast(it.second))
s << " ⇒ " << it.second->GetTunnelID ();
else
s << " ⇒ " << it.second->GetTunnelID () << " ⇒ ";
diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp
index dff66951..7cebf96a 100644
--- a/I2NPProtocol.cpp
+++ b/I2NPProtocol.cpp
@@ -301,8 +301,7 @@ namespace i2p
i2p::tunnel::tunnels.GetTransitTunnels ().size () <= MAX_NUM_TRANSIT_TUNNELS &&
!i2p::transport::transports.IsBandwidthExceeded ())
{
- i2p::tunnel::TransitTunnel * transitTunnel =
- i2p::tunnel::CreateTransitTunnel (
+ auto transitTunnel = i2p::tunnel::CreateTransitTunnel (
bufbe32toh (clearText + BUILD_REQUEST_RECORD_RECEIVE_TUNNEL_OFFSET),
clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET),
diff --git a/TransitTunnel.cpp b/TransitTunnel.cpp
index 81773bb5..0d54fc11 100644
--- a/TransitTunnel.cpp
+++ b/TransitTunnel.cpp
@@ -85,7 +85,7 @@ namespace tunnel
m_Endpoint.HandleDecryptedTunnelDataMsg (newMsg);
}
- TransitTunnel * CreateTransitTunnel (uint32_t receiveTunnelID,
+ std::shared_ptr CreateTransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey,
bool isGateway, bool isEndpoint)
@@ -93,17 +93,17 @@ namespace tunnel
if (isEndpoint)
{
LogPrint (eLogInfo, "TransitTunnel: endpoint ", receiveTunnelID, " created");
- return new TransitTunnelEndpoint (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
+ return std::make_shared (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
}
else if (isGateway)
{
LogPrint (eLogInfo, "TransitTunnel: gateway ", receiveTunnelID, " created");
- return new TransitTunnelGateway (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
+ return std::make_shared (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
}
else
{
LogPrint (eLogInfo, "TransitTunnel: ", receiveTunnelID, "->", nextTunnelID, " created");
- return new TransitTunnelParticipant (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
+ return std::make_shared (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
}
}
}
diff --git a/TransitTunnel.h b/TransitTunnel.h
index e611d685..2a1908df 100644
--- a/TransitTunnel.h
+++ b/TransitTunnel.h
@@ -93,7 +93,7 @@ namespace tunnel
TunnelEndpoint m_Endpoint;
};
- TransitTunnel * CreateTransitTunnel (uint32_t receiveTunnelID,
+ std::shared_ptr CreateTransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey,
bool isGateway, bool isEndpoint);
diff --git a/Tunnel.cpp b/Tunnel.cpp
index f7102327..715a10f9 100644
--- a/Tunnel.cpp
+++ b/Tunnel.cpp
@@ -257,9 +257,6 @@ namespace tunnel
Tunnels::~Tunnels ()
{
- for (auto& it : m_TransitTunnels)
- delete it.second;
- m_TransitTunnels.clear ();
}
std::shared_ptr Tunnels::GetInboundTunnel (uint32_t tunnelID)
@@ -270,7 +267,7 @@ namespace tunnel
return nullptr;
}
- TransitTunnel * Tunnels::GetTransitTunnel (uint32_t tunnelID)
+ std::shared_ptr Tunnels::GetTransitTunnel (uint32_t tunnelID)
{
auto it = m_TransitTunnels.find(tunnelID);
if (it != m_TransitTunnels.end ())
@@ -363,14 +360,11 @@ namespace tunnel
}
}
- void Tunnels::AddTransitTunnel (TransitTunnel * tunnel)
+ void Tunnels::AddTransitTunnel (std::shared_ptr tunnel)
{
std::unique_lock l(m_TransitTunnelsMutex);
if (!m_TransitTunnels.insert (std::make_pair (tunnel->GetTunnelID (), tunnel)).second)
- {
LogPrint (eLogError, "Tunnel: transit tunnel with id ", tunnel->GetTunnelID (), " already exists");
- delete tunnel;
- }
}
void Tunnels::Start ()
@@ -404,10 +398,10 @@ namespace tunnel
if (msg)
{
uint32_t prevTunnelID = 0, tunnelID = 0;
- TunnelBase * prevTunnel = nullptr;
+ std::shared_ptr prevTunnel;
do
{
- TunnelBase * tunnel = nullptr;
+ std::shared_ptr tunnel;
uint8_t typeID = msg->GetTypeID ();
switch (typeID)
{
@@ -421,7 +415,7 @@ namespace tunnel
prevTunnel->FlushTunnelDataMsgs ();
if (!tunnel && typeID == eI2NPTunnelData)
- tunnel = GetInboundTunnel (tunnelID).get ();
+ tunnel = GetInboundTunnel (tunnelID);
if (!tunnel)
tunnel = GetTransitTunnel (tunnelID);
if (tunnel)
@@ -471,7 +465,7 @@ namespace tunnel
}
}
- void Tunnels::HandleTunnelGatewayMsg (TunnelBase * tunnel, std::shared_ptr msg)
+ void Tunnels::HandleTunnelGatewayMsg (std::shared_ptr tunnel, std::shared_ptr msg)
{
if (!tunnel)
{
@@ -690,7 +684,6 @@ namespace tunnel
std::unique_lock l(m_TransitTunnelsMutex);
it = m_TransitTunnels.erase (it);
}
- delete tmp;
}
else
it++;
diff --git a/Tunnel.h b/Tunnel.h
index 138a48fc..d37646d1 100644
--- a/Tunnel.h
+++ b/Tunnel.h
@@ -142,9 +142,9 @@ namespace tunnel
std::shared_ptr GetNextInboundTunnel ();
std::shared_ptr GetNextOutboundTunnel ();
std::shared_ptr GetExploratoryPool () const { return m_ExploratoryPool; };
- TransitTunnel * GetTransitTunnel (uint32_t tunnelID);
+ std::shared_ptr GetTransitTunnel (uint32_t tunnelID);
int GetTransitTunnelsExpirationTimeout ();
- void AddTransitTunnel (TransitTunnel * tunnel);
+ void AddTransitTunnel (std::shared_ptr tunnel);
void AddOutboundTunnel (std::shared_ptr newTunnel);
void AddInboundTunnel (std::shared_ptr newTunnel);
void PostTunnelData (std::shared_ptr msg);
@@ -163,7 +163,7 @@ namespace tunnel
template
std::shared_ptr GetPendingTunnel (uint32_t replyMsgID, const std::map >& pendingTunnels);
- void HandleTunnelGatewayMsg (TunnelBase * tunnel, std::shared_ptr msg);
+ void HandleTunnelGatewayMsg (std::shared_ptr tunnel, std::shared_ptr msg);
void Run ();
void ManageTunnels ();
@@ -186,7 +186,7 @@ namespace tunnel
std::map > m_InboundTunnels;
std::list > m_OutboundTunnels;
std::mutex m_TransitTunnelsMutex;
- std::map m_TransitTunnels;
+ std::map > m_TransitTunnels;
std::mutex m_PoolsMutex;
std::list> m_Pools;
std::shared_ptr m_ExploratoryPool;