diff --git a/Tunnel.cpp b/Tunnel.cpp index e1f5c035..84c4979f 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -19,36 +19,11 @@ namespace i2p { namespace tunnel -{ - - void TunnelLatency::AddSample(Sample s) - { - std::unique_lock l(m_access); - m_samples.push_back(s); - } - - bool TunnelLatency::HasSamples() const - { - std::unique_lock l(m_access); - return m_samples.size() > 0; - } - - TunnelLatency::Latency TunnelLatency::GetMeanLatency() const - { - std::unique_lock lock(m_access); - if (m_samples.size() > 0) { - Latency l = 0; - for(auto s : m_samples) - l += s; - return l / m_samples.size(); - } - return 0; - } - - +{ Tunnel::Tunnel (std::shared_ptr config): TunnelBase (config->GetTunnelID (), config->GetNextTunnelID (), config->GetNextIdentHash ()), - m_Config (config), m_Pool (nullptr), m_State (eTunnelStatePending), m_IsRecreated (false) + m_Config (config), m_Pool (nullptr), m_State (eTunnelStatePending), m_IsRecreated (false), + m_Latency (0) { } diff --git a/Tunnel.h b/Tunnel.h index f3c31461..08533ec4 100644 --- a/Tunnel.h +++ b/Tunnel.h @@ -78,21 +78,6 @@ namespace tunnel eTunnelStateFailed, eTunnelStateExpiring }; - - /** @brief for storing latency history */ - struct TunnelLatency - { - typedef uint64_t Sample; - typedef uint64_t Latency; - - - void AddSample(Sample s); - bool HasSamples() const; - Latency GetMeanLatency() const; - - std::vector m_samples; - mutable std::mutex m_access; - }; class OutboundTunnel; class InboundTunnel; @@ -133,14 +118,14 @@ namespace tunnel void SendTunnelDataMsg (std::shared_ptr msg); void EncryptTunnelMsg (std::shared_ptr in, std::shared_ptr out); - /** @brief add latency sample */ - void AddLatencySample(const uint64_t ms) { m_Latency.AddSample(ms); } - /** @brief get this tunnel's estimated latency */ - uint64_t GetMeanLatency() const { return m_Latency.GetMeanLatency(); } - /** @breif return true if this tunnel's latency fits in range [lowerbound, upperbound] */ - bool LatencyFitsRange(uint64_t lowerbound, uint64_t upperbound) const; + /** @brief add latency sample */ + void AddLatencySample(const uint64_t ms) { m_Latency = (m_Latency + ms) >> 1; } + /** @brief get this tunnel's estimated latency */ + uint64_t GetMeanLatency() const { return m_Latency; } + /** @breif return true if this tunnel's latency fits in range [lowerbound, upperbound] */ + bool LatencyFitsRange(uint64_t lowerbound, uint64_t upperbound) const; - bool LatencyIsKnown() const { return m_Latency.HasSamples(); } + bool LatencyIsKnown() const { return m_Latency > 0; } protected: void PrintHops (std::stringstream& s) const; @@ -152,7 +137,7 @@ namespace tunnel std::shared_ptr m_Pool; // pool, tunnel belongs to, or null TunnelState m_State; bool m_IsRecreated; - TunnelLatency m_Latency; + uint64_t m_Latency; // in milliseconds }; class OutboundTunnel: public Tunnel