src/utils_time.h: Add macros for converting to "struct timespec" ..
[collectd.git] / src / utils_time.h
1 /**
2  * collectd - src/utils_time.h
3  * Copyright (C) 2010  Florian octo Forster
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License as published by the
7  * Free Software Foundation; only version 2 of the License is applicable.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
17  *
18  * Authors:
19  *   Florian octo Forster <ff at octo.it>
20  **/
21
22 #ifndef UTILS_TIME_H
23 #define UTILS_TIME_H 1
24
25 #include "collectd.h"
26
27 /*
28  * "cdtime_t" is a 64bit unsigned integer. The time is stored at a 2^-30 second
29  * resolution, i.e. the most significant 34 bit are used to store the time in
30  * seconds, the least significant bits store the sub-second part in something
31  * very close to nanoseconds. *The* big advantage of storing time in this
32  * manner is that comparing times and calculating differences is as simple as
33  * it is with "time_t", i.e. a simple integer comparison / subtraction works.
34  */
35 typedef uint64_t cdtime_t;
36
37 /* 2^30 = 1073741824 */
38 #define TIME_T_TO_CDTIME_T(t) (((cdtime_t) (t)) * 1073741824)
39 #define CDTIME_T_TO_TIME_T(t) ((time_t) ((t) / 1073741824))
40
41 #define CDTIME_T_TO_DOUBLE(t) (((double) (t)) / 1073741824.0)
42 #define DOUBLE_TO_CDTIME_T(d) ((cdtime_t) ((d) * 1073741824.0))
43
44 #define US_TO_CDTIME_T(us) ((cdtime_t)    (((double) (us)) * 1073.741824))
45 #define CDTIME_T_TO_US(t)  ((suseconds_t) (((double) (t))  / 1073.741824))
46 #define NS_TO_CDTIME_T(ns) ((cdtime_t)    (((double) (ns)) * 1.073741824))
47 #define CDTIME_T_TO_NS(t)  ((long)        (((double) (t))  / 1.073741824))
48
49 #define CDTIME_T_TO_TIMEVAL(t) { \
50         CDTIME_T_TO_TIME_T (t), \
51         CDTIME_T_TO_US (t % 1073741824) \
52 }
53 #define TIMEVAL_TO_CDTIME_T(tv) (TIME_T_TO_CDTIME_T ((tv).tv_sec) \
54                 + US_TO_CDTIME_T ((tv).tv_usec))
55
56 #define CDTIME_T_TO_TIMESPEC(t) { \
57         CDTIME_T_TO_TIME_T (t), \
58         CDTIME_T_TO_NS (t % 1073741824) \
59 }
60 #define TIMESPEC_TO_CDTIME_T(ts) (TIME_T_TO_CDTIME_T ((ts).tv_sec) \
61                 + NS_TO_CDTIME_T ((ts).tv_nsec))
62
63 cdtime_t cdtime (void);
64
65 #endif /* UTILS_TIME_H */