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 <array>
20#include <atomic>
21#include <memory>
22#include <mutex>
23#include <string>
24#include <unordered_set>
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, sms + MSEP + _1 + MSEP + _2 + smsr + MSEP + reason); \
61 }
62
63#define MESSAGE_6(level, msg, reason, _1, _2, _3) \
64 { \
65 MESSAGE_STATICS(msg) \
66 t_msghandler::ref().message(level, sms + MSEP + _1 + MSEP + _2 + MSEP + _3 + smsr + MSEP + reason); \
67 }
68
69#define MESSAGE_7(level, msg, reason, _1, _2, _3, _4) \
70 { \
71 MESSAGE_STATICS(msg) \
72 t_msghandler::ref().message(level, sms + MSEP + _1 + MSEP + _2 + MSEP + _3 + MSEP + _4 + smsr + MSEP + reason); \
73 }
74
75#define MSGHNDL_DEBUG_LEVEL t_messenger::debug
76#define MSGHNDL_INFO_LEVEL t_messenger::info
77#define MSGHNDL_NOTE_LEVEL t_messenger::note
78#define MSGHNDL_WARN_LEVEL t_messenger::warn
79#define MSGHNDL_ERROR_LEVEL t_messenger::error
80#define MSGHNDL_FAIL_LEVEL t_messenger::fail
81
82#define WARN(...) VA_SELECT(WARN, __VA_ARGS__)
83
84#define WARN_2(msg, reason) MESSAGE_3(MSGHNDL_WARN_LEVEL, msg, reason)
85#define WARN_3(msg, reason, var) MESSAGE_4(MSGHNDL_WARN_LEVEL, msg, reason, var)
86#define WARN_4(msg, reason, var, _4) MESSAGE_5(MSGHNDL_WARN_LEVEL, msg, reason, var, _4)
87#define WARN_5(msg, reason, var, _4, _5) MESSAGE_6(MSGHNDL_WARN_LEVEL, msg, reason, var, _4, _5)
88#define WARN_6(msg, reason, var, _4, _5, _6) MESSAGE_7(MSGHNDL_WARN_LEVEL, msg, reason, var, _4, _5, _6)
89
90#define ERROR(...) VA_SELECT(ERROR, __VA_ARGS__)
91
92#define ERROR_2(msg, reason) MESSAGE_3(MSGHNDL_ERROR_LEVEL, msg, reason)
93#define ERROR_3(msg, reason, var) MESSAGE_4(MSGHNDL_ERROR_LEVEL, msg, reason, var)
94#define ERROR_4(msg, reason, var, _4) MESSAGE_5(MSGHNDL_ERROR_LEVEL, msg, reason, var, _4)
95#define ERROR_5(msg, reason, var, _4, _5) MESSAGE_6(MSGHNDL_ERROR_LEVEL, msg, reason, var, _4, _5)
96#define ERROR_6(msg, reason, var, _4, _5, _6) MESSAGE_7(MSGHNDL_ERROR_LEVEL, msg, reason, var, _4, _5, _6)
97
98#define INFO(...) VA_SELECT(INFO, __VA_ARGS__)
99
100#define INFO_2(msg, reason) MESSAGE_3(MSGHNDL_INFO_LEVEL, msg, reason)
101#define INFO_3(msg, reason, var) MESSAGE_4(MSGHNDL_INFO_LEVEL, msg, reason, var)
102#define INFO_4(msg, reason, var, _4) MESSAGE_5(MSGHNDL_INFO_LEVEL, msg, reason, var, _4)
103#define INFO_5(msg, reason, var, _4, _5) MESSAGE_6(MSGHNDL_INFO_LEVEL, msg, reason, var, _4, _5)
104
105#define NOTE(...) VA_SELECT(NOTE, __VA_ARGS__)
106
107#define NOTE_2(msg, reason) MESSAGE_3(MSGHNDL_NOTE_LEVEL, msg, reason)
108#define NOTE_3(msg, reason, var) MESSAGE_4(MSGHNDL_NOTE_LEVEL, msg, reason, var)
109#define NOTE_4(msg, reason, var, _4) MESSAGE_5(MSGHNDL_NOTE_LEVEL, msg, reason, var, _4)
110#define NOTE_5(msg, reason, var, _4, _5) MESSAGE_6(MSGHNDL_NOTE_LEVEL, msg, reason, var, _4, _5)
111
112#ifdef MSGHNDL_FULLDEBUG_INFORMATION
113#define FULLDEBUG(...) VA_SELECT(DEBUG, __VA_ARGS__)
114#else
115#define FULLDEBUG(...)
116#endif
117
118#ifdef MSGHNDL_FULLDEBUG_INFORMATION
119#define DEBUG(...) VA_SELECT(DEBUG, __VA_ARGS__)
120#else
121#define DEBUG(...)
122#endif
123
124#define DEBUG_2(msg, reason) MESSAGE_3(MSGHNDL_DEBUG_LEVEL, msg, reason)
125#define DEBUG_3(msg, reason, var) MESSAGE_4(MSGHNDL_DEBUG_LEVEL, msg, reason, var)
126#define DEBUG_4(msg, reason, var, _4) MESSAGE_5(MSGHNDL_DEBUG_LEVEL, msg, reason, var, _4)
127#define DEBUG_5(msg, reason, var, _4, _5) MESSAGE_6(MSGHNDL_DEBUG_LEVEL, msg, reason, var, _4, _5)
128
129#define FAIL(...) VA_SELECT(FAIL, __VA_ARGS__)
130
131#define FAIL_2(msg, reason) MESSAGE_3(MSGHNDL_FAIL_LEVEL, msg, reason)
132#define FAIL_3(msg, reason, var) MESSAGE_4(MSGHNDL_FAIL_LEVEL, msg, reason, var)
133#define FAIL_4(msg, reason, var, _4) MESSAGE_5(MSGHNDL_FAIL_LEVEL, msg, reason, var, _4)
134#define FAIL_5(msg, reason, var, _4, _5) MESSAGE_6(MSGHNDL_FAIL_LEVEL, msg, reason, var, _4, _5)
135
136namespace dbe {
137namespace interface {
138namespace messenger {
149
150class qt;
151
153{
154 friend class qt;
155 ~batch_guard();
156
157private:
158 batch_guard();
159};
160
162{
163 typedef std::string t_str;
164 typedef std::vector<t_str> t_levels;
165 static t_str const debug, info, note, warn, error, fail;
166 static t_levels const all_levels;
167};
168
173class qt : public msglevels
174{
175 friend class batch_guard;
176
177public:
178 typedef std::string t_str;
179
180 // used to inform at compile time msg handler that this class provides a post function
182
190 static post_ret_type post(t_str const&, t_str const&);
191
198 static std::unique_ptr<batch_guard> batchmode();
199
200private:
201 qt() = delete;
202 qt(qt const&) = delete;
203 qt operator=(qt const&) = delete;
204
205 static post_ret_type direct_post(t_str const& m, t_str const& l);
206 static post_ret_type merge_post(t_str const& m, t_str const& l);
207
211 static void purge();
212
213 static std::mutex m_block;
214 static std::atomic<bool> m_batch_mode;
215
216 typedef std::unordered_multiset<t_str> t_message_bucket;
217 typedef std::array<t_message_bucket, static_cast<int>(messages::sizeme)> t_batches;
219};
220
221class console : public msglevels
222{
223public:
225 typedef std::string t_str;
226};
227
228} /* namespace messenger */
229} /* namespace interface */
230} /* namespace dbe */
231
232#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)
Definition messenger.cpp:99
std::array< t_message_bucket, static_cast< int >(messages::sizeme)> t_batches
static post_ret_type direct_post(t_str const &m, t_str const &l)
Definition messenger.cpp:73
static HAS_POST post_ret_type post(t_str const &, t_str const &)
Definition messenger.cpp:59
qt operator=(qt const &)=delete
std::unordered_multiset< t_str > t_message_bucket
#define ERROR(...)
Definition messenger.hpp:90
#define NOTE(...)
#define WARN(...)
Definition messenger.hpp:82
#define DEBUG(...)
#define FAIL(...)
#define INFO(...)
Definition messenger.hpp:98
#define DEFAULT_POST
#define HAS_POST
Include QT Headers.