From fa8548fe341fd7d13d0bbbfd397135237c03c8a4 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 30 Aug 2016 15:11:39 -0400 Subject: [PATCH] implement SetCustomPeerSelector and ensure locking is good --- TunnelPool.cpp | 27 ++++++++++++++++++++++++--- TunnelPool.h | 7 ++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/TunnelPool.cpp b/TunnelPool.cpp index ba7a86a3..35272f2c 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -331,8 +331,12 @@ namespace tunnel int numHops = isInbound ? m_NumInboundHops : m_NumOutboundHops; // peers is empty if (numHops <= 0) return true; - // custom peer selector in use - if (m_CustomPeerSelector) return m_CustomPeerSelector->SelectPeers(peers, numHops, isInbound); + // custom peer selector in use ? + { + std::lock_guard lock(m_CustomPeerSelectorMutex); + if (m_CustomPeerSelector) + return m_CustomPeerSelector->SelectPeers(peers, numHops, isInbound); + } // explicit peers in use if (m_ExplicitPeers) return SelectExplicitPeers (peers, isInbound); @@ -483,6 +487,23 @@ namespace tunnel LogPrint (eLogDebug, "Tunnels: Creating paired inbound tunnel..."); auto tunnel = tunnels.CreateInboundTunnel (std::make_shared(outboundTunnel->GetInvertedPeers ()), outboundTunnel); tunnel->SetTunnelPool (shared_from_this ()); - } + } + + void TunnelPool::SetCustomPeerSelector(TunnelPeerSelector selector) + { + std::lock_guard lock(m_CustomPeerSelectorMutex); + m_CustomPeerSelector = selector; + } + + void TunnelPool::UnsetCustomPeerSelector() + { + SetCustomPeerSelector(nullptr); + } + + bool TunnelPool::HasCustomPeerSelector() + { + std::lock_guard lock(m_CustomPeerSelectorMutex); + return m_CustomPeerSelector != nullptr; + } } } diff --git a/TunnelPool.h b/TunnelPool.h index bffecba5..d5bcf18f 100644 --- a/TunnelPool.h +++ b/TunnelPool.h @@ -67,10 +67,10 @@ namespace tunnel int GetNumOutboundTunnels () const { return m_NumOutboundTunnels; }; void SetCustomPeerSelector(TunnelPeerSelector selector); - TunnelPeerSelector GetCustomPeerSelector() const { return m_CustomPeerSelector; } - + void UnsetCustomPeerSelector(); + bool HasCustomPeerSelector(); private: - + void CreateInboundTunnel (); void CreateOutboundTunnel (); void CreatePairedInboundTunnel (std::shared_ptr outboundTunnel); @@ -92,6 +92,7 @@ namespace tunnel mutable std::mutex m_TestsMutex; std::map, std::shared_ptr > > m_Tests; bool m_IsActive; + std::mutex m_CustomPeerSelectorMutex; TunnelPeerSelector m_CustomPeerSelector; public: