From 538a19fd47944da094894f2bdff3cfeaf9c2dc06 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sun, 2 Aug 2015 10:47:05 -0700 Subject: [PATCH] Implement GetConnections(). --- src/Dispatcher.cpp | 17 +++++++++++++++++ src/Dispatcher.h | 3 ++- src/NetworkConnection.cpp | 3 +++ src/NetworkConnection.h | 3 +++ src/ntcore_cpp.cpp | 2 +- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index 7fe48e50df..85e6e1195c 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -128,6 +128,23 @@ void DispatcherBase::Flush() { m_flush_cv.notify_one(); } +std::vector DispatcherBase::GetConnections() const { + std::vector conns; + if (!m_active) return conns; + + std::lock_guard lock(m_user_mutex); + for (auto& conn : m_connections) { + if (conn.net->state() != NetworkConnection::kActive) continue; + auto& stream = conn.net->stream(); + conns.emplace_back( + ConnectionInfo{conn.net->remote_id(), stream.getPeerIP(), + static_cast(stream.getPeerPort()), + conn.net->last_update(), conn.net->proto_rev()}); + } + + return conns; +} + void DispatcherBase::DispatchThreadMain() { // local copy of active m_connections struct ConnectionRef { diff --git a/src/Dispatcher.h b/src/Dispatcher.h index 15fcfe8c22..0d4638cabe 100644 --- a/src/Dispatcher.h +++ b/src/Dispatcher.h @@ -39,6 +39,7 @@ class DispatcherBase { void SetUpdateRate(double interval); void SetIdentity(llvm::StringRef name); void Flush(); + std::vector GetConnections() const; bool active() const { return m_active; } @@ -77,7 +78,7 @@ class DispatcherBase { std::unique_ptr m_server_acceptor; // Mutex for user-accessible items - std::mutex m_user_mutex; + mutable std::mutex m_user_mutex; struct Connection { Connection() = default; explicit Connection(std::unique_ptr net_) diff --git a/src/NetworkConnection.cpp b/src/NetworkConnection.cpp index 0a6d937191..42f837f097 100644 --- a/src/NetworkConnection.cpp +++ b/src/NetworkConnection.cpp @@ -7,6 +7,7 @@ #include "NetworkConnection.h" +#include "support/timestamp.h" #include "tcpsockets/NetworkStream.h" #include "Log.h" #include "raw_socket_istream.h" @@ -26,6 +27,7 @@ NetworkConnection::NetworkConnection(std::unique_ptr stream, m_active = false; m_proto_rev = 0x0300; m_state = static_cast(kCreated); + m_last_update = 0; } NetworkConnection::~NetworkConnection() { Stop(); } @@ -98,6 +100,7 @@ void NetworkConnection::ReadThreadMain() { if (m_stream) m_stream->close(); break; } + m_last_update = Now(); m_process_incoming(std::move(msg), this); } DEBUG3("read thread died"); diff --git a/src/NetworkConnection.h b/src/NetworkConnection.h index 508b6ca543..a8ba281307 100644 --- a/src/NetworkConnection.h +++ b/src/NetworkConnection.h @@ -55,6 +55,8 @@ class NetworkConnection { std::string remote_id() const; void set_remote_id(StringRef remote_id); + unsigned long long last_update() const { return m_last_update; } + NetworkConnection(const NetworkConnection&) = delete; NetworkConnection& operator=(const NetworkConnection&) = delete; @@ -74,6 +76,7 @@ class NetworkConnection { std::atomic_int m_state; mutable std::mutex m_remote_id_mutex; std::string m_remote_id; + std::atomic_ullong m_last_update; }; } // namespace nt diff --git a/src/ntcore_cpp.cpp b/src/ntcore_cpp.cpp index c8e1291dd3..1d9ca55023 100644 --- a/src/ntcore_cpp.cpp +++ b/src/ntcore_cpp.cpp @@ -126,7 +126,7 @@ void SetUpdateRate(double interval) { } std::vector GetConnections() { - return std::vector(); + return Dispatcher::GetInstance().GetConnections(); } /*