DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
NetworkManager.hpp
Go to the documentation of this file.
1
10#ifndef IOMANAGER_INCLUDE_IOMANAGER_NETWORK_NETWORKMANAGER_HPP_
11#define IOMANAGER_INCLUDE_IOMANAGER_NETWORK_NETWORKMANAGER_HPP_
12
15
16#include "ipm/Receiver.hpp"
17#include "ipm/Sender.hpp"
18#include "ipm/Subscriber.hpp"
20
23
24#include <atomic>
25#include <chrono>
26#include <functional>
27#include <memory>
28#include <mutex>
29#include <set>
30#include <string>
31#include <thread>
32#include <unordered_map>
33#include <utility>
34#include <vector>
35
36namespace dunedaq::iomanager {
37
39{
40
41public:
42 static NetworkManager& get();
44
45 void configure(const std::string& session_name,
46 const std::vector<const confmodel::NetworkConnection*>& connections,
47 const confmodel::ConnectivityService* conn_svc,
49 void reset();
50 void shutdown();
51
52 std::shared_ptr<ipm::Receiver> get_receiver(ConnectionId const& conn_id);
53 std::shared_ptr<ipm::Sender> get_sender(ConnectionId const& conn_id);
54
55 void remove_sender(ConnectionId const& conn_id);
56
57 bool is_pubsub_connection(ConnectionId const& conn_id) const;
58
59 ConnectionResponse get_connections(ConnectionId const& conn_id, bool restrict_single = false) const;
61
62 std::set<std::string> get_datatypes(std::string const& uid) const;
63
64private:
65 // NetworkManager is a singleton
66 static std::unique_ptr<NetworkManager> s_instance;
67
68 NetworkManager() = default;
69
74
75 std::shared_ptr<ipm::Receiver> create_receiver(std::vector<ConnectionInfo> connections, ConnectionId const& conn_id);
76 std::shared_ptr<ipm::Sender> create_sender(ConnectionInfo connection);
77
78 std::vector<std::string> get_pubsub_connection_strings(std::vector<ConnectionInfo> const& connections);
79 void update_subscribers();
80
81 std::unordered_map<ConnectionId, const confmodel::NetworkConnection*> m_preconfigured_connections;
82 std::unordered_map<ConnectionId, std::shared_ptr<ipm::Receiver>> m_receiver_plugins;
83 std::unordered_map<ConnectionId, std::shared_ptr<ipm::Sender>> m_sender_plugins;
84 std::shared_ptr<dunedaq::opmonlib::OpMonLink> m_sender_opmon_link{ std::make_shared<dunedaq::opmonlib::OpMonLink>() };
85 std::shared_ptr<dunedaq::opmonlib::OpMonLink> m_receiver_opmon_link{
86 std::make_shared<dunedaq::opmonlib::OpMonLink>()
87 };
88 static void register_monitorable_node(std::shared_ptr<opmonlib::MonitorableObject> conn,
89 std::shared_ptr<opmonlib::OpMonLink> link,
90 const std::string& name,
91 bool is_pubsub);
92
93 std::unordered_map<ConnectionId, std::shared_ptr<ipm::Subscriber>> m_subscriber_plugins;
94 std::unique_ptr<std::thread> m_subscriber_update_thread;
95 std::atomic<bool> m_subscriber_update_thread_running{ false };
96
97 std::unique_ptr<ConfigClient> m_config_client;
98 std::chrono::milliseconds m_config_client_interval{ 1000 };
99
100 mutable std::mutex m_receiver_plugin_map_mutex;
101 mutable std::mutex m_sender_plugin_map_mutex;
103};
104} // namespace dunedaq::iomanager
105
106#endif // IOMANAGER_INCLUDE_IOMANAGER_NETWORK_NETWORKMANAGER_HPP_
ConnectionResponse get_preconfigured_connections(ConnectionId const &conn_id) const
void configure(const std::string &session_name, const std::vector< const confmodel::NetworkConnection * > &connections, const confmodel::ConnectivityService *conn_svc, dunedaq::opmonlib::OpMonManager &)
std::atomic< bool > m_subscriber_update_thread_running
std::unordered_map< ConnectionId, std::shared_ptr< ipm::Receiver > > m_receiver_plugins
std::shared_ptr< ipm::Receiver > create_receiver(std::vector< ConnectionInfo > connections, ConnectionId const &conn_id)
NetworkManager(NetworkManager const &)=delete
std::unordered_map< ConnectionId, std::shared_ptr< ipm::Sender > > m_sender_plugins
std::unordered_map< ConnectionId, const confmodel::NetworkConnection * > m_preconfigured_connections
std::unique_ptr< std::thread > m_subscriber_update_thread
std::set< std::string > get_datatypes(std::string const &uid) const
static NetworkManager & get()
std::shared_ptr< dunedaq::opmonlib::OpMonLink > m_sender_opmon_link
std::shared_ptr< ipm::Sender > create_sender(ConnectionInfo connection)
std::shared_ptr< ipm::Sender > get_sender(ConnectionId const &conn_id)
std::unique_ptr< ConfigClient > m_config_client
static void register_monitorable_node(std::shared_ptr< opmonlib::MonitorableObject > conn, std::shared_ptr< opmonlib::OpMonLink > link, const std::string &name, bool is_pubsub)
NetworkManager(NetworkManager &&)=delete
NetworkManager & operator=(NetworkManager &&)=delete
ConnectionResponse get_connections(ConnectionId const &conn_id, bool restrict_single=false) const
bool is_pubsub_connection(ConnectionId const &conn_id) const
static std::unique_ptr< NetworkManager > s_instance
std::chrono::milliseconds m_config_client_interval
std::shared_ptr< ipm::Receiver > get_receiver(ConnectionId const &conn_id)
std::vector< std::string > get_pubsub_connection_strings(std::vector< ConnectionInfo > const &connections)
NetworkManager & operator=(NetworkManager const &)=delete
void remove_sender(ConnectionId const &conn_id)
std::unordered_map< ConnectionId, std::shared_ptr< ipm::Subscriber > > m_subscriber_plugins
std::shared_ptr< dunedaq::opmonlib::OpMonLink > m_receiver_opmon_link