27 #include <boost/bind.hpp>
28 #include <graphlab/parallel/pthread_tools.hpp>
29 #include <graphlab/parallel/atomic.hpp>
30 #include <graphlab/util/timer.hpp>
31 #include <graphlab/util/dense_bitset.hpp>
34 #define EVENT_MAX_COUNTERS 256
38 enum event_print_type{
46 volatile size_t flush_interval;
47 event_print_type print_method;
48 volatile bool finished;
53 thread printing_thread;
54 std::string descriptions[EVENT_MAX_COUNTERS];
55 size_t maxcounter[EVENT_MAX_COUNTERS];
56 atomic<size_t> counters[EVENT_MAX_COUNTERS];
57 atomic<size_t> totalcounter[EVENT_MAX_COUNTERS];
59 std::vector<std::pair<unsigned char, size_t> > immediate_events;
66 size_t max_desc_length;
67 fixed_dense_bitset<EVENT_MAX_COUNTERS> hascounter;
69 inline event_log():out(NULL),
71 print_method(DESCRIPTION),
78 for (
size_t i = 0;i < EVENT_MAX_COUNTERS; ++i) {
80 totalcounter[i].value = 0;
82 printing_thread.launch(boost::bind(&event_log::thread_loop,
this));
85 void initialize(std::ostream &ostrm,
86 size_t flush_interval_ms,
87 event_print_type event_print);
93 void add_event_type(
unsigned char eventid, std::string description);
94 void add_immediate_event_type(
unsigned char eventid, std::string description);
96 inline void accumulate_event(
unsigned char eventid,
97 size_t count) __attribute__((always_inline)) {
99 counters[eventid].inc(count);
100 totalcounter[eventid].inc(count);
103 void immediate_event(
unsigned char eventid);
145 #define DECLARE_EVENT_LOG(name) graphlab::event_log name;
146 #define INITIALIZE_EVENT_LOG(name, ostrm, flush_interval, printdesc) \
147 name.initialize(ostrm, flush_interval, printdesc);
148 #define ADD_EVENT_TYPE(name, id, desc) name.add_event_type(id, desc);
149 #define ADD_IMMEDIATE_EVENT_TYPE(name, id, desc) name.add_immediate_event_type(id, desc);
150 #define ACCUMULATE_EVENT(name, id, count) name.accumulate_event(id, count);
151 #define IMMEDIATE_EVENT(name, id) name.immediate_event(id);
152 #define FLUSH_EVENT_LOG(name) name.flush();
153 #define CLOSE_EVENT_LOG(name) name.close();
156 #define DECLARE_EVENT_LOG(name)
157 #define INITIALIZE_EVENT_LOG(name, ostrm, flush_interval, printdesc)
158 #define ADD_EVENT_TYPE(name, id, desc)
159 #define ADD_IMMEDIATE_EVENT_TYPE(name, id, desc)
160 #define ACCUMULATE_EVENT(name, id, count)
161 #define IMMEDIATE_EVENT(name, id)
162 #define FLUSH_EVENT_LOG(name)
163 #define CLOSE_EVENT_LOG(name)
166 #define PERMANENT_DECLARE_EVENT_LOG(name) graphlab::event_log name;
167 #define PERMANENT_INITIALIZE_EVENT_LOG(name, ostrm, flush_interval, printdesc) \
168 name.initialize(ostrm, flush_interval, printdesc);
169 #define PERMANENT_ADD_EVENT_TYPE(name, id, desc) name.add_event_type(id, desc);
170 #define PERMANENT_ADD_IMMEDIATE_EVENT_TYPE(name, id, desc) name.add_immediate_event_type(id, desc);
171 #define PERMANENT_ACCUMULATE_EVENT(name, id, count) name.accumulate_event(id, count);
172 #define PERMANENT_IMMEDIATE_EVENT(name, id) name.immediate_event(id);
173 #define PERMANENT_FLUSH_EVENT_LOG(name) name.flush();
174 #define PERMANENT_CLOSE_EVENT_LOG(name) name.close();