jle_cpp_tk  0.0 2015-04-03 sh1:"d699093732dd5f321606d0ff7a6b63b229f1922c"
A small, safe, selft contained, soft-realtime C++ toolkit
alarm.h
1 #ifndef JLE_ALARM_H
2 #define JLE_ALARM_H
3 
4 
5 #include <string>
6 #include <sstream>
7 #include <list>
8 
9 #include "core/misc.h"
10 #include "core/chrono.h"
11 
12 
13 
14 
16 
17 
18 
19 
20 namespace jle {
21 
23 namespace al {
24 
25 
26 #define JLE_HERE JLE_SS(__PRETTY_FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ << ")")
27 
28 
29 //---------------------------------------------------------------------------
30 
31 
32 enum class priority {
33  critic ,
34  error ,
35  warning ,
36  debug ,
37  stats
38  };
39 
40 
41 enum class type {
42  unknown ,
43  no_permisions ,
44  overflow ,
45  realtime ,
46  logic_error
47  };
48 
49 
50 
51 
52 
53 struct base_alarm {
54  base_alarm() = delete;
55  base_alarm(const base_alarm&) = default;
56  base_alarm& operator=(const base_alarm&) = default;
57  base_alarm& operator=(base_alarm&&) = default;
58 
59 
60  std::string code_source ;
61  std::string subject ;
62  std::string message ;
63  al::priority priority ;
64  al::type type ;
65  jle::chrono::time_point time_point ;
66 
67  base_alarm (
68  const std::string& _code_source ,
69  const std::string& _subject ,
70  const std::string& _message ,
71  al::priority _priority ,
72  al::type _type
73  )
74  : code_source (_code_source),
75  subject (_subject),
76  message (_message),
77  priority (_priority),
78  type (_type),
79  time_point (jle::chrono::now())
80  {};
81 
82 
83  virtual ~base_alarm(){};
84 };
85 
86 
87 }; // namespace al
88 
89 
90 
91 
92 
93 
94 
95 struct alarm : public al::base_alarm
96 {
97  alarm() = delete;
98  alarm(const alarm&) = default;
99  alarm& operator=(const alarm&) = default;
100  alarm& operator=(alarm&&) = default;
101 
102  explicit alarm (
103  const std::string& _codeSource,
104  const std::string& _subject,
105  const std::string& _message,
106  al::priority _priority,
107  al::type _type = al::type::unknown
108  )
109  : base_alarm(_codeSource, _subject, _message, _priority, _type)
110  , alarm_id(++class_alarm_id%=2000000000)
111  , stack_alarms() {}
112 
113  const int alarm_id;
114 
115  alarm& add (const base_alarm& prev_alarm) {
116  stack_alarms.push_back(prev_alarm);
117  return *this;
118  };
119 
120  alarm& add (const alarm& prev_alarm) {
121  stack_alarms.push_back(prev_alarm);
122 
123  std::list<base_alarm>::const_iterator it= prev_alarm.stack_alarms.begin();
124  while (it != prev_alarm.stack_alarms.end())
125  {
126  stack_alarms.push_back(*it);
127  ++it;
128  }
129  return *this;
130  };
131 
132 
133  std::list<base_alarm> stack_alarms;
134 
135 private:
136  static int class_alarm_id;
137 };
138 
139 
140 
141 //---------------------------------------------------------------------------
142 
143 
144 extern void alarm_msg (const alarm& error);
145 
146 
147 //---------------------------------------------------------------------------
148 
149 
150 //---------------------------------------------------------------------------
151 
152 
153 
154 // rethrow will ignore when alarms are equals
155 #define JLE_CATCH_RETHROW(__SUBJECT__, __DESCRIPTION__) \
156  catch (jle::alarm& __alarm__) { \
157  if (__alarm__.subject == __SUBJECT__ && __alarm__.message ==(__DESCRIPTION__ +std::string(" alarm"))) \
158  throw __alarm__; \
159  jle::alarm jle_error( \
160  JLE_HERE, \
161  __SUBJECT__, \
162  __DESCRIPTION__ +std::string(" alarm"), \
163  __alarm__.priority, \
164  __alarm__.type \
165  ); \
166  jle_error.add(__alarm__); \
167  throw (jle_error); \
168  } catch (std::exception& e) { \
169  throw jle::alarm( \
170  JLE_HERE, \
171  __SUBJECT__, \
172  __DESCRIPTION__ +std::string(" exception ") + e.what(),\
173  jle::al::priority::critic); \
174  } catch (...) { \
175  throw jle::alarm( \
176  JLE_HERE, \
177  __SUBJECT__, \
178  __DESCRIPTION__ +std::string(" ..."), \
179  jle::al::priority::critic); \
180  }
181 
182 #define JLE_CATCH_CALLFUNCION(__FUNCTION2CALL__, __SUBJECT__, __DESCRIPTION__) \
183  catch (const jle::alarm& __alarm__) { \
184  jle::alarm jle_error( \
185  JLE_HERE, \
186  __SUBJECT__, \
187  __DESCRIPTION__ + std::string(" alarm"),\
188  jle::al::priority::critic, \
189  __alarm__.type \
190  ); \
191  jle_error.add(__alarm__); \
192  __FUNCTION2CALL__ (jle_error); \
193  } catch (std::exception& e) { \
194  __FUNCTION2CALL__ (jle::alarm( \
195  JLE_HERE, \
196  __SUBJECT__, \
197  __DESCRIPTION__ + std::string(" exception ") + e.what(), \
198  jle::al::priority::critic)); \
199  } catch (...) { \
200  __FUNCTION2CALL__ (jle::alarm( \
201  JLE_HERE, \
202  __SUBJECT__, \
203  __DESCRIPTION__ + std::string(" exception"),\
204  jle::al::priority::critic)); \
205  }
206 
207 std::ostream& operator<< (std::ostream& os, const jle::alarm& a);
208 
209 }; // end namespace jle {
210 
211 
212 
213 
214 
215 
216 #endif // JLE_ALARM_H
similar to std::chrono::time_point but monotonic with adjustments to system_clock ...
Definition: chrono.h:42
Definition: alarm.h:95
Definition: alarm.h:53
generic namespace
Definition: alarm.cpp:12