multipathd: fix reservation_key check
[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 /* Initialize @cond as a condition variable that uses the monotonic clock */
7 void pthread_cond_init_mono(pthread_cond_t *cond)
8 {
9         pthread_condattr_t attr;
10         int res;
11
12         res = pthread_condattr_init(&attr);
13         assert(res == 0);
14         res = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
15         assert(res == 0);
16         res = pthread_cond_init(cond, &attr);
17         assert(res == 0);
18         res = pthread_condattr_destroy(&attr);
19         assert(res == 0);
20 }
21
22 /* Ensure that 0 <= ts->tv_nsec && ts->tv_nsec < 1000 * 1000 * 1000. */
23 void normalize_timespec(struct timespec *ts)
24 {
25         while (ts->tv_nsec < 0) {
26                 ts->tv_nsec += 1000UL * 1000 * 1000;
27                 ts->tv_sec--;
28         }
29         while (ts->tv_nsec >= 1000UL * 1000 * 1000) {
30                 ts->tv_nsec -= 1000UL * 1000 * 1000;
31                 ts->tv_sec++;
32         }
33 }
34
35 /* Compute *res = *a - *b */
36 void timespecsub(const struct timespec *a, const struct timespec *b,
37                  struct timespec *res)
38 {
39         res->tv_sec = a->tv_sec - b->tv_sec;
40         res->tv_nsec = a->tv_nsec - b->tv_nsec;
41         normalize_timespec(res);
42 }