]> AND Private Git Repository - loba.git/blob - timer.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Be consistent and hold mutex in any case when returning from condition_t::timedwait().
[loba.git] / timer.h
1 #ifndef TIMER_H
2 #define TIMER_H
3
4 #include <ctime>
5
6 inline
7 struct timespec operator+(const struct timespec& a, const struct timespec& b)
8 {
9     struct timespec result;
10     result.tv_sec = a.tv_sec + b.tv_sec;
11     result.tv_nsec = a.tv_nsec + b.tv_nsec;
12     if (result.tv_nsec >= 1000000000L) {
13         ++result.tv_sec;
14         result.tv_nsec -= 1000000000L;
15     }
16     return result;
17 }
18
19 inline
20 struct timespec operator-(const struct timespec& a, const struct timespec& b)
21 {
22     struct timespec result;
23     result.tv_sec = a.tv_sec - b.tv_sec;
24     result.tv_nsec = a.tv_nsec - b.tv_nsec;
25     if (result.tv_nsec < 0) {
26         --result.tv_sec;
27         result.tv_nsec += 1000000000L;
28     }
29     return result;
30 }
31
32 class timestamp {
33 public:
34     enum clock_type { wallclock_time, cpu_time };
35
36     timestamp(clock_type ct);
37     ~timestamp();
38     void reset();
39
40     void start();
41     void stop();
42
43     struct timespec tv_duration() const;
44     double duration() const;
45
46 private:
47     clock_type clk;
48     struct timespec before;
49     struct timespec after;
50     struct timespec difference;
51
52     void get_time(struct timespec& tv);
53
54     static void tv_clear(struct timespec& a);
55     static double timertod(const struct timespec& a);
56 };
57
58 inline
59 timestamp::timestamp(clock_type ct): clk(ct)
60 {
61     reset();
62 }
63
64 inline
65 timestamp::~timestamp()
66 {
67 }
68
69 inline
70 void timestamp::reset()
71 {
72     tv_clear(before);
73     tv_clear(after);
74     tv_clear(difference);
75 }
76
77 inline
78 void timestamp::start()
79 {
80     get_time(before);
81 }
82
83 inline
84 void timestamp::stop()
85 {
86     get_time(after);
87     difference = difference + (after - before);
88 }
89
90 inline
91 struct timespec timestamp::tv_duration() const
92 {
93     return difference;
94 }
95
96 inline
97 double timestamp::duration() const
98 {
99     return timertod(difference);
100 }
101
102 inline
103 void timestamp::get_time(struct timespec& tv)
104 {
105     switch (clk) {
106     case cpu_time: {
107         clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tv);
108         break;
109     }
110     case wallclock_time:
111 #ifdef CLOCK_MONOTONIC_RAW
112         clock_gettime(CLOCK_MONOTONIC_RAW, &tv);
113 #else
114         clock_gettime(CLOCK_MONOTONIC, &tv);
115 #endif
116         break;
117     }
118 }
119
120 inline
121 void timestamp::tv_clear(struct timespec& a)
122 {
123     a.tv_sec = 0;
124     a.tv_nsec = 0;
125 }
126
127 inline
128 double timestamp::timertod(const struct timespec& a)
129 {
130     return a.tv_sec + a.tv_nsec / 1e9;
131 }
132
133 #endif // !TIMER_H
134
135 // Local variables:
136 // mode: c++
137 // End: