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