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