X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdaemon%2Futils_time.h;h=f9973698ec2a59923d0204b5918370bc57c7d4dd;hb=a762b2b4a6d804139c9ab5f47afacc1a88d6c0c1;hp=9b08e8e4de68f011d24b4dc947c9d23922506544;hpb=6258e772d808f4e76ea8e23d9e2750cfc7e6c60d;p=collectd.git diff --git a/src/daemon/utils_time.h b/src/daemon/utils_time.h index 9b08e8e4..f9973698 100644 --- a/src/daemon/utils_time.h +++ b/src/daemon/utils_time.h @@ -1,6 +1,6 @@ /** - * collectd - src/utils_time.h - * Copyright (C) 2010 Florian octo Forster + * collectd - src/daemon/utils_time.h + * Copyright (C) 2010-2015 Florian octo Forster * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -21,7 +21,7 @@ * DEALINGS IN THE SOFTWARE. * * Authors: - * Florian octo Forster + * Florian octo Forster **/ #ifndef UTILS_TIME_H @@ -29,6 +29,12 @@ #include "collectd.h" +#ifdef TESTING_H +/* cdtime_mock is the time returned by cdtime() when build with + * -DMOCK_TIME */ +extern cdtime_t cdtime_mock; +#endif + /* * "cdtime_t" is a 64bit unsigned integer. The time is stored at a 2^-30 second * resolution, i.e. the most significant 34 bit are used to store the time in @@ -37,45 +43,63 @@ * manner is that comparing times and calculating differences is as simple as * it is with "time_t", i.e. a simple integer comparison / subtraction works. */ -/* +/* * cdtime_t is defined in "collectd.h" */ /* typedef uint64_t cdtime_t; */ /* 2^30 = 1073741824 */ -#define TIME_T_TO_CDTIME_T(t) (((cdtime_t) (t)) * 1073741824) -#define CDTIME_T_TO_TIME_T(t) ((time_t) ((t) / 1073741824)) +#define TIME_T_TO_CDTIME_T(t) (((cdtime_t) (t)) << 30) + +#define MS_TO_CDTIME_T(ms) (((((cdtime_t) (ms)) / 1000) << 30) | \ + ((((((cdtime_t) (ms)) % 1000) << 30) + 500) / 1000)) +#define US_TO_CDTIME_T(us) (((((cdtime_t) (us)) / 1000000) << 30) | \ + ((((((cdtime_t) (us)) % 1000000) << 30) + 500000) / 1000000)) +#define NS_TO_CDTIME_T(ns) (((((cdtime_t) (ns)) / 1000000000) << 30) | \ + ((((((cdtime_t) (ns)) % 1000000000) << 30) + 500000000) / 1000000000)) + +#define CDTIME_T_TO_TIME_T(t) ((time_t) (((t) + (1 << 29)) >> 30)) +#define CDTIME_T_TO_MS(t) ((uint64_t) ((((t) >> 30) * 1000) + \ + ((((t) & 0x3fffffff) * 1000 + (1 << 29)) >> 30))) +#define CDTIME_T_TO_US(t) ((uint64_t) ((((t) >> 30) * 1000000) + \ + ((((t) & 0x3fffffff) * 1000000 + (1 << 29)) >> 30))) +#define CDTIME_T_TO_NS(t) ((uint64_t) ((((t) >> 30) * 1000000000) + \ + ((((t) & 0x3fffffff) * 1000000000 + (1 << 29)) >> 30))) #define CDTIME_T_TO_DOUBLE(t) (((double) (t)) / 1073741824.0) #define DOUBLE_TO_CDTIME_T(d) ((cdtime_t) ((d) * 1073741824.0)) -#define MS_TO_CDTIME_T(ms) ((cdtime_t) (((double) (ms)) * 1073741.824)) -#define CDTIME_T_TO_MS(t) ((long) (((double) (t)) / 1073741.824)) -#define US_TO_CDTIME_T(us) ((cdtime_t) (((double) (us)) * 1073.741824)) -#define CDTIME_T_TO_US(t) ((suseconds_t) (((double) (t)) / 1073.741824)) -#define NS_TO_CDTIME_T(ns) ((cdtime_t) (((double) (ns)) * 1.073741824)) -#define CDTIME_T_TO_NS(t) ((long) (((double) (t)) / 1.073741824)) - -#define CDTIME_T_TO_TIMEVAL(cdt,tvp) do { \ - (tvp)->tv_sec = CDTIME_T_TO_TIME_T (cdt); \ - (tvp)->tv_usec = CDTIME_T_TO_US ((cdt) % 1073741824); \ -} while (0) -#define TIMEVAL_TO_CDTIME_T(tv) (TIME_T_TO_CDTIME_T ((tv)->tv_sec) \ - + US_TO_CDTIME_T ((tv)->tv_usec)) - -#define CDTIME_T_TO_TIMESPEC(cdt,tsp) do { \ - (tsp)->tv_sec = CDTIME_T_TO_TIME_T (cdt); \ - (tsp)->tv_nsec = CDTIME_T_TO_NS ((cdt) % 1073741824); \ -} while (0) -#define TIMESPEC_TO_CDTIME_T(ts) (TIME_T_TO_CDTIME_T ((ts)->tv_sec) \ - + NS_TO_CDTIME_T ((ts)->tv_nsec)) +#define CDTIME_T_TO_TIMEVAL(t) (struct timeval) { \ + .tv_sec = (time_t) ((t) >> 30), \ + .tv_usec = (suseconds_t) ((((t) & 0x3fffffff) * 1000000 + (1 << 29)) >> 30), \ +} +#define TIMEVAL_TO_CDTIME_T(tv) US_TO_CDTIME_T(1000000 * (tv)->tv_sec + (tv)->tv_usec) + +#define CDTIME_T_TO_TIMESPEC(t) (struct timespec) { \ + .tv_sec = (time_t) ((t) >> 30), \ + .tv_nsec = (long) ((((t) & 0x3fffffff) * 1000000000 + (1 << 29)) >> 30), \ +} +#define TIMESPEC_TO_CDTIME_T(ts) NS_TO_CDTIME_T(1000000000ULL * (ts)->tv_sec + (ts)->tv_nsec) cdtime_t cdtime (void); -/* format a cdtime_t value in ISO 8601 format: - * returns the number of characters written to the string (not including the - * terminating null byte or 0 on error; the function ensures that the string - * is null terminated */ -size_t cdtime_to_iso8601 (char *s, size_t max, cdtime_t t); +#define RFC3339_SIZE 26 /* 2006-01-02T15:04:05+00:00 */ +#define RFC3339NANO_SIZE 36 /* 2006-01-02T15:04:05.999999999+00:00 */ + +/* rfc3339 formats a cdtime_t time as UTC in RFC 3339 zulu format with second + * precision, e.g., "2006-01-02T15:04:05Z". */ +int rfc3339 (char *buffer, size_t buffer_size, cdtime_t t); + +/* rfc3339nano formats a cdtime_t as UTC time in RFC 3339 zulu format with + * nanosecond precision, e.g., "2006-01-02T15:04:05.999999999Z". */ +int rfc3339nano (char *buffer, size_t buffer_size, cdtime_t t); + +/* rfc3339 formats a cdtime_t time as local in RFC 3339 format with second + * precision, e.g., "2006-01-02T15:04:05+00:00". */ +int rfc3339_local (char *buffer, size_t buffer_size, cdtime_t t); + +/* rfc3339nano formats a cdtime_t time as local in RFC 3339 format with + * nanosecond precision, e.g., "2006-01-02T15:04:05.999999999+00:00". */ +int rfc3339nano_local (char *buffer, size_t buffer_size, cdtime_t t); #endif /* UTILS_TIME_H */ /* vim: set sw=2 sts=2 et : */