DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
messenger.hpp
Go to the documentation of this file.
1// DUNE DAQ modification notice:
2// This file has been modified from the original ATLAS dbe source for the DUNE DAQ project.
3// Fork baseline commit: dbe-02-12-17 (2022-05-12).
4// Renamed since fork: yes (from dbe/messenger.h to include/dbe/messenger.hpp).
5
6/*
7 * messenger.h
8 *
9 * Created on: Nov 3, 2015
10 * Author: lgeorgop
11 */
12
13#ifndef DBE_MESSENGER_H_
14#define DBE_MESSENGER_H_
15
16#include "dbe/macro.hpp"
17#include "dbe/msghandler.hpp"
18
19#include <string>
20#include <memory>
21#include <mutex>
22#include <unordered_set>
23#include <array>
24#include <atomic>
25
26#ifndef t_messenger
27#define t_messenger dbe::interface::messenger::qt
28#endif
29
30#ifndef t_msghandler
31#define t_msghandler ::lutils::program::msghandler<t_messenger>
32#endif
33
34#define MESSAGE(...) VA_SELECT(MESSAGE,__VA_ARGS__)
35
36#define MSEP " "
37
38#ifndef MESSAGE_STATICS
39#define MESSAGE_STATICS(msg) \
40 static t_msghandler::t_str sms(msg); \
41 static t_msghandler::t_str smsr("\n\nReason: "); \
42
43#endif
44
45#define MESSAGE_3(level,msg,reason) \
46{\
47 MESSAGE_STATICS(msg) \
48 t_msghandler::ref().message( level, sms + smsr + MSEP +reason); \
49}\
50
51#define MESSAGE_4(level,msg,reason,_1) \
52{\
53 MESSAGE_STATICS(msg) \
54 t_msghandler::ref().message( level, sms + MSEP + _1 + smsr + MSEP + reason); \
55}\
56
57#define MESSAGE_5(level,msg,reason,_1,_2) \
58{\
59 MESSAGE_STATICS(msg) \
60 t_msghandler::ref().message( level, \
61 sms + MSEP + _1 + MSEP + _2 + smsr +MSEP+ reason); \
62}\
63
64#define MESSAGE_6(level,msg,reason,_1,_2,_3) \
65{\
66 MESSAGE_STATICS(msg) \
67 t_msghandler::ref().message( level, \
68 sms + MSEP + _1 + MSEP + _2 + MSEP + _3 + smsr +MSEP + reason); \
69}\
70
71#define MESSAGE_7(level,msg,reason,_1,_2,_3,_4) \
72{\
73 MESSAGE_STATICS(msg) \
74 t_msghandler::ref().message( level,\
75 sms + MSEP+_1 +MSEP+ _2 + MSEP +_3 + MSEP + _4 + smsr + MSEP + reason); \
76}\
77
78#define MSGHNDL_DEBUG_LEVEL t_messenger::debug
79#define MSGHNDL_INFO_LEVEL t_messenger::info
80#define MSGHNDL_NOTE_LEVEL t_messenger::note
81#define MSGHNDL_WARN_LEVEL t_messenger::warn
82#define MSGHNDL_ERROR_LEVEL t_messenger::error
83#define MSGHNDL_FAIL_LEVEL t_messenger::fail
84
85#define WARN(...) VA_SELECT(WARN,__VA_ARGS__)
86
87#define WARN_2(msg,reason) MESSAGE_3(MSGHNDL_WARN_LEVEL,msg,reason)
88#define WARN_3(msg,reason,var) MESSAGE_4(MSGHNDL_WARN_LEVEL,msg,reason,var)
89#define WARN_4(msg,reason,var,_4) MESSAGE_5(MSGHNDL_WARN_LEVEL,msg,reason,var,_4)
90#define WARN_5(msg,reason,var,_4,_5) MESSAGE_6(MSGHNDL_WARN_LEVEL,msg,reason,var,_4,_5)
91#define WARN_6(msg,reason,var,_4,_5,_6) MESSAGE_7(MSGHNDL_WARN_LEVEL,msg,reason,var,_4,_5,_6)
92
93#define ERROR(...) VA_SELECT(ERROR,__VA_ARGS__)
94
95#define ERROR_2(msg,reason) MESSAGE_3(MSGHNDL_ERROR_LEVEL,msg,reason)
96#define ERROR_3(msg,reason,var) MESSAGE_4(MSGHNDL_ERROR_LEVEL,msg,reason,var)
97#define ERROR_4(msg,reason,var,_4) MESSAGE_5(MSGHNDL_ERROR_LEVEL,msg,reason,var,_4)
98#define ERROR_5(msg,reason,var,_4,_5) MESSAGE_6(MSGHNDL_ERROR_LEVEL,msg,reason,var,_4,_5)
99#define ERROR_6(msg,reason,var,_4,_5,_6) MESSAGE_7(MSGHNDL_ERROR_LEVEL,msg,reason,var,_4,_5,_6)
100
101#define INFO(...) VA_SELECT(INFO,__VA_ARGS__)
102
103#define INFO_2(msg,reason) MESSAGE_3(MSGHNDL_INFO_LEVEL,msg,reason)
104#define INFO_3(msg,reason,var) MESSAGE_4(MSGHNDL_INFO_LEVEL,msg,reason,var)
105#define INFO_4(msg,reason,var,_4) MESSAGE_5(MSGHNDL_INFO_LEVEL,msg,reason,var,_4)
106#define INFO_5(msg,reason,var,_4,_5) MESSAGE_6(MSGHNDL_INFO_LEVEL,msg,reason,var,_4,_5)
107
108#define NOTE(...) VA_SELECT(NOTE,__VA_ARGS__)
109
110#define NOTE_2(msg,reason) MESSAGE_3(MSGHNDL_NOTE_LEVEL,msg,reason)
111#define NOTE_3(msg,reason,var) MESSAGE_4(MSGHNDL_NOTE_LEVEL,msg,reason,var)
112#define NOTE_4(msg,reason,var,_4) MESSAGE_5(MSGHNDL_NOTE_LEVEL,msg,reason,var,_4)
113#define NOTE_5(msg,reason,var,_4,_5) MESSAGE_6(MSGHNDL_NOTE_LEVEL,msg,reason,var,_4,_5)
114
115
116#ifdef MSGHNDL_FULLDEBUG_INFORMATION
117#define FULLDEBUG(...) VA_SELECT(DEBUG,__VA_ARGS__)
118#else
119#define FULLDEBUG(...)
120#endif
121
122#ifdef MSGHNDL_FULLDEBUG_INFORMATION
123#define DEBUG(...) VA_SELECT(DEBUG,__VA_ARGS__)
124#else
125#define DEBUG(...)
126#endif
127
128#define DEBUG_2(msg,reason) MESSAGE_3(MSGHNDL_DEBUG_LEVEL,msg,reason)
129#define DEBUG_3(msg,reason,var) MESSAGE_4(MSGHNDL_DEBUG_LEVEL,msg,reason,var)
130#define DEBUG_4(msg,reason,var,_4) MESSAGE_5(MSGHNDL_DEBUG_LEVEL,msg,reason,var,_4)
131#define DEBUG_5(msg,reason,var,_4,_5) MESSAGE_6(MSGHNDL_DEBUG_LEVEL,msg,reason,var,_4,_5)
132
133#define FAIL(...) VA_SELECT(FAIL,__VA_ARGS__)
134
135#define FAIL_2(msg,reason) MESSAGE_3(MSGHNDL_FAIL_LEVEL,msg,reason)
136#define FAIL_3(msg,reason,var) MESSAGE_4(MSGHNDL_FAIL_LEVEL,msg,reason,var)
137#define FAIL_4(msg,reason,var,_4) MESSAGE_5(MSGHNDL_FAIL_LEVEL,msg,reason,var,_4)
138#define FAIL_5(msg,reason,var,_4,_5) MESSAGE_6(MSGHNDL_FAIL_LEVEL,msg,reason,var,_4,_5)
139
140namespace dbe
141{
142namespace interface
143{
144namespace messenger
145{
156
157class qt;
158
160{
161 friend class qt;
162 ~batch_guard();
163private:
164 batch_guard();
165};
166
168{
169 typedef std::string t_str;
170 typedef std::vector<t_str> t_levels;
171 static t_str const debug, info, note, warn, error, fail;
172 static t_levels const all_levels;
173};
174
179class qt:
180 public msglevels
181{
182 friend class batch_guard;
183public:
184 typedef std::string t_str;
185
186 // used to inform at compile time msg handler that this class provides a post function
188
196 static post_ret_type post ( t_str const &, t_str const & );
197
204 static std::unique_ptr<batch_guard> batchmode();
205
206private:
207 qt() = delete;
208 qt ( qt const & ) = delete;
209 qt operator= ( qt const & ) = delete;
210
211 static post_ret_type direct_post ( t_str const & m, t_str const & l );
212 static post_ret_type merge_post ( t_str const & m, t_str const & l );
213
217 static void purge();
218
219 static std::mutex m_block;
220 static std::atomic<bool> m_batch_mode;
221
222 typedef std::unordered_multiset<t_str> t_message_bucket;
223 typedef std::array<t_message_bucket, static_cast<int> ( messages::sizeme ) > t_batches;
225};
226
228 public msglevels
229{
230public:
232 typedef std::string t_str;
233};
234
235} /* namespace messenger */
236} /* namespace interface */
237} /* namespace dbe */
238
239#endif /* DBE_MESSENGER_H_ */
DEFAULT_POST typedef std::string t_str
static std::atomic< bool > m_batch_mode
static std::unique_ptr< batch_guard > batchmode()
static post_ret_type merge_post(t_str const &m, t_str const &l)
static post_ret_type direct_post(t_str const &m, t_str const &l)
Definition messenger.cpp:92
static HAS_POST post_ret_type post(t_str const &, t_str const &)
Definition messenger.cpp:76
qt operator=(qt const &)=delete
std::unordered_multiset< t_str > t_message_bucket
std::array< t_message_bucket, static_cast< int >(messages::sizeme) > t_batches
#define ERROR(...)
Definition messenger.hpp:93
#define NOTE(...)
#define WARN(...)
Definition messenger.hpp:85
#define DEBUG(...)
#define FAIL(...)
#define INFO(...)
#define DEFAULT_POST
#define HAS_POST
Include QT Headers.