bccd813f11c5544ab353d916e5d3b4be4383fe81
[invirt/third/libt4.git] / threaded_log.h
1 #ifndef threaded_log_h
2 #define threaded_log_h
3
4 #include "types.h"
5
6 extern mutex cerr_mutex;
7 extern map<thread::id, int> thread_name_map;
8 extern int next_thread_num;
9 extern map<void *, int> instance_name_map;
10 extern int next_instance_num;
11 extern char log_thread_prefix;
12
13 #define LOG_PREFIX { \
14     auto _thread_ = this_thread::get_id(); \
15     int _tid_ = thread_name_map[_thread_]; \
16     if (_tid_==0) \
17         _tid_ = thread_name_map[_thread_] = ++next_thread_num; \
18     auto _utime_ = duration_cast<microseconds>(system_clock::now().time_since_epoch()).count() % 1000000000; \
19     cerr << setfill('0') << dec << left << setw(9) << _utime_ << " "; \
20     cerr << setfill(' ') << log_thread_prefix << left << setw(2) << _tid_; \
21     cerr << " " << setw(20) << __FILE__ << " " << setw(18) << __func__; \
22 }
23 #define LOG_THIS_POINTER { \
24     int _self_ = instance_name_map[this]; \
25     if (_self_==0) \
26         _self_ = instance_name_map[this] = ++next_instance_num; \
27     cerr << "#" << left << setw(2) << _self_ << " "; \
28 }
29
30 #define LOG_NONMEMBER(_x_) { \
31     lock _cel_(cerr_mutex); \
32     LOG_PREFIX; \
33     cerr << _x_ << endl; \
34 }
35 #define LOG(_x_) { \
36     lock _cel_(cerr_mutex); \
37     LOG_PREFIX; \
38     LOG_THIS_POINTER; \
39     cerr << _x_ << endl; \
40 }
41
42 extern int DEBUG_LEVEL;
43
44 #define IF_LEVEL(level) if(DEBUG_LEVEL >= abs(level))
45
46 #endif