multipath-tools (coverity): assert availability of CLOCK_MONOTONIC
[multipath-tools/.git] / libmultipath / time-util.c
1 #include <assert.h>
2 #include <pthread.h>
3 #include <time.h>
4 #include "time-util.h"
5
6 void get_monotonic_time(struct timespec *res)
7 {
8         struct timespec ts;
9         int rv = clock_gettime(CLOCK_MONOTONIC, &ts);
10
11         assert(rv == 0);
12         *res = ts;
13 }
14
15 /* Initialize @cond as a condition variable that uses the monotonic clock */
16 void pthread_cond_init_mono(pthread_cond_t *cond)
17 {
18         pthread_condattr_t attr;
19         int res;
20
21         res = pthread_condattr_init(&attr);
22         assert(res == 0);
23         res = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
24         assert(res == 0);
25         res = pthread_cond_init(cond, &attr);
26         assert(res == 0);
27         res = pthread_condattr_destroy(&attr);
28         assert(res == 0);
29 }
30
31 /* Ensure that 0 <= ts->tv_nsec && ts->tv_nsec < 1000 * 1000 * 1000. */
32 void normalize_timespec(struct timespec *ts)
33 {
34         while (ts->tv_nsec < 0) {
35                 ts->tv_nsec += 1000UL * 1000 * 1000;
36                 ts->tv_sec--;
37         }
38         while (ts->tv_nsec >= 1000UL * 1000 * 1000) {
39                 ts->tv_nsec -= 1000UL * 1000 * 1000;
40                 ts->tv_sec++;
41         }
42 }
43
44 /* Compute *res = *a - *b */
45 void timespecsub(const struct timespec *a, const struct timespec *b,
46                  struct timespec *res)
47 {
48         res->tv_sec = a->tv_sec - b->tv_sec;
49         res->tv_nsec = a->tv_nsec - b->tv_nsec;
50         normalize_timespec(res);
51 }