DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
IOManager.hxx
Go to the documentation of this file.
8
9#include "nlohmann/json.hpp"
10
11#include <cstdlib>
12#include <map>
13#include <memory>
14#include <regex>
15#include <string>
16
17namespace dunedaq {
18
19namespace iomanager {
20
21
22template<typename Datatype>
23inline void
24IOManager::add_callback(ConnectionId const& id, std::function<void(Datatype&)> callback)
25{
26 auto receiver = get_receiver<Datatype>(id);
27 receiver->add_callback(callback);
28}
29
30template<typename Datatype>
31inline std::shared_ptr<ReceiverConcept<Datatype>>
32IOManager::get_receiver(std::string const& uid)
33{
34 auto data_type = datatype_to_string<Datatype>();
35 ConnectionId id;
36 id.uid = uid;
37 id.data_type = data_type;
38 id.session = m_session;
39 return get_receiver<Datatype>(id);
40}
41template<typename Datatype>
42inline std::shared_ptr<ReceiverConcept<Datatype>>
43IOManager::get_receiver(std::string const& uid, std::string const& tag)
44{
45 auto data_type = datatype_to_string<Datatype>();
46 ConnectionId id;
47 id.uid = uid;
48 id.data_type = data_type;
49 id.session = m_session;
50 id.tag = tag;
51 return get_receiver<Datatype>(id);
52}
53
54template<typename Datatype>
55inline std::shared_ptr<ReceiverConcept<Datatype>>
57{
58 if (id.data_type != datatype_to_string<Datatype>()) {
59 throw DatatypeMismatch(ERS_HERE, id.uid, id.data_type, datatype_to_string<Datatype>());
60 }
61
62 if (id.session == "") {
63 id.session = m_session;
64 }
65
66 static std::mutex dt_receiver_mutex;
67 std::lock_guard<std::mutex> lk(dt_receiver_mutex);
68
69 if (!m_receivers.count(id)) {
70 if (QueueRegistry::get().has_queue(id.uid, id.data_type)) { // if queue
71 TLOG("IOManager") << "Creating QueueReceiverModel for uid " << id.uid << ", datatype " << id.data_type;
72 m_receivers[id] = std::make_shared<QueueReceiverModel<Datatype>>(id);
73 } else {
74 TLOG("IOManager") << "Creating NetworkReceiverModel for uid " << id.uid << ", datatype " << id.data_type
75 << " in session " << id.session;
76 m_receivers[id] = std::make_shared<NetworkReceiverModel<Datatype>>(id);
77 }
78 }
79 return std::dynamic_pointer_cast<ReceiverConcept<Datatype>>(m_receivers[id]); // NOLINT
80}
81
82template<typename Datatype>
83inline std::shared_ptr<SenderConcept<Datatype>>
84IOManager::get_sender(std::string const& uid)
85{
86 auto data_type = datatype_to_string<Datatype>();
87 ConnectionId id;
88 id.uid = uid;
89 id.data_type = data_type;
90 id.session = m_session;
91 return get_sender<Datatype>(id);
92}
93
94template<typename Datatype>
95inline std::shared_ptr<SenderConcept<Datatype>>
97{
98 if (id.data_type != datatype_to_string<Datatype>()) {
99 throw DatatypeMismatch(ERS_HERE, id.uid, id.data_type, datatype_to_string<Datatype>());
100 }
101
102 if (id.session == "") {
103 id.session = m_session;
104 }
105
106 static std::mutex dt_sender_mutex;
107 std::lock_guard<std::mutex> lk(dt_sender_mutex);
108
109 if (!m_senders.count(id)) {
110 if (QueueRegistry::get().has_queue(id.uid, id.data_type)) { // if queue
111 TLOG("IOManager") << "Creating QueueSenderModel for uid " << id.uid << ", datatype " << id.data_type;
112 m_senders[id] = std::make_shared<QueueSenderModel<Datatype>>(id);
113 } else {
114 TLOG("IOManager") << "Creating NetworkSenderModel for uid " << id.uid << ", datatype " << id.data_type
115 << " in session " << id.session;
116 m_senders[id] = std::make_shared<NetworkSenderModel<Datatype>>(id);
117 }
118 }
119 return std::dynamic_pointer_cast<SenderConcept<Datatype>>(m_senders[id]);
120}
121
122template<typename Datatype>
123inline void
124IOManager::add_callback(std::string const& uid, std::function<void(Datatype&)> callback)
125{
126 auto receiver = get_receiver<Datatype>(uid);
127 receiver->add_callback(callback);
128}
129
130template<typename Datatype>
131inline void
132IOManager::add_callback(std::string const& uid, std::string const& tag, std::function<void(Datatype&)> callback)
133{
134 auto receiver = get_receiver<Datatype>(uid, tag);
135 receiver->add_callback(callback);
136}
137
138template<typename Datatype>
139inline void
141{
142 auto receiver = get_receiver<Datatype>(id);
143 receiver->remove_callback();
144}
145
146template<typename Datatype>
147inline void
148IOManager::remove_callback(std::string const& uid)
149{
150 auto receiver = get_receiver<Datatype>(uid);
151 receiver->remove_callback();
152}
153template<typename Datatype>
154inline void
155IOManager::remove_callback(std::string const& uid, std::string const& tag)
156{
157 auto receiver = get_receiver<Datatype>(uid, tag);
158 receiver->remove_callback();
159}
160
161} // namespace iomanager
162
163// Helper functions
164[[maybe_unused]] static std::shared_ptr<iomanager::IOManager> // NOLINT(build/namespaces)
166{
168}
169
170template<typename Datatype>
171static std::shared_ptr<iomanager::SenderConcept<Datatype>> // NOLINT(build/namespaces)
173{
174 return iomanager::IOManager::get()->get_sender<Datatype>(id);
175}
176
177template<typename Datatype>
178static std::shared_ptr<iomanager::ReceiverConcept<Datatype>> // NOLINT(build/namespaces)
180{
181 return iomanager::IOManager::get()->get_receiver<Datatype>(id);
182}
183
184template<typename Datatype>
185static std::shared_ptr<iomanager::SenderConcept<Datatype>> // NOLINT(build/namespaces)
186get_iom_sender(std::string const& uid)
187{
188 return iomanager::IOManager::get()->get_sender<Datatype>(uid);
189}
190
191template<typename Datatype>
192static std::shared_ptr<iomanager::ReceiverConcept<Datatype>> // NOLINT(build/namespaces)
193get_iom_receiver(std::string const& uid)
194{
195 return iomanager::IOManager::get()->get_receiver<Datatype>(uid);
196}
197} // namespace dunedaq
#define ERS_HERE
static std::shared_ptr< IOManager > get()
Definition IOManager.hpp:40
void add_callback(ConnectionId const &id, std::function< void(Datatype &)> callback)
Definition IOManager.hxx:24
std::shared_ptr< SenderConcept< Datatype > > get_sender(ConnectionId id)
Definition IOManager.hxx:96
void remove_callback(ConnectionId const &id)
std::shared_ptr< ReceiverConcept< Datatype > > get_receiver(ConnectionId id)
Definition IOManager.hxx:56
static QueueRegistry & get()
Get a handle to the QueueRegistry.
#define TLOG(...)
Definition macro.hpp:22
Including Qt Headers.
static std::shared_ptr< iomanager::SenderConcept< Datatype > > get_iom_sender(iomanager::ConnectionId const &id)
Unknown serialization Cannot deserialize std::string datatype_to_string()
static std::shared_ptr< iomanager::IOManager > get_iomanager()
static std::shared_ptr< iomanager::ReceiverConcept< Datatype > > get_iom_receiver(iomanager::ConnectionId const &id)