diff options
| author | Jiri Moskovcak <jmoskovc@redhat.com> | 2009-10-26 16:28:12 +0100 |
|---|---|---|
| committer | Jiri Moskovcak <jmoskovc@redhat.com> | 2009-10-26 16:28:12 +0100 |
| commit | be0c8d7252ae74610d885e21f47e454f8538898f (patch) | |
| tree | e3da4305d7e8ea44d7732051013a71198e664aea /lib/Utils/time.cpp | |
| parent | 53ed713b135762ad7b572f39301d80a646173820 (diff) | |
| parent | b1756b440359c381ebafd62709ddcfa78ea74805 (diff) | |
| download | abrt-be0c8d7252ae74610d885e21f47e454f8538898f.tar.gz abrt-be0c8d7252ae74610d885e21f47e454f8538898f.tar.xz abrt-be0c8d7252ae74610d885e21f47e454f8538898f.zip | |
Merge branch 'master' of git://git.fedorahosted.org/git/abrt
Diffstat (limited to 'lib/Utils/time.cpp')
| -rw-r--r-- | lib/Utils/time.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/Utils/time.cpp b/lib/Utils/time.cpp new file mode 100644 index 0000000..37ade2c --- /dev/null +++ b/lib/Utils/time.cpp @@ -0,0 +1,65 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Licensed under GPL version 2, see file LICENSE in this tarball for details. + */ +#include "abrtlib.h" + +#define ENABLE_MONOTONIC_SYSCALL 1 + +#if ENABLE_MONOTONIC_SYSCALL + +#include <sys/syscall.h> +/* Old glibc (< 2.3.4) does not provide this constant. We use syscall + * directly so this definition is safe. */ +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC 1 +#endif + +/* libc has incredibly messy way of doing this, + * typically requiring -lrt. We just skip all this mess */ +static void get_mono(struct timespec *ts) +{ + if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts)) + error_msg_and_die("clock_gettime(MONOTONIC) failed"); +} +unsigned long long monotonic_ns(void) +{ + struct timespec ts; + get_mono(&ts); + return ts.tv_sec * 1000000000ULL + ts.tv_nsec; +} +unsigned long long monotonic_us(void) +{ + struct timespec ts; + get_mono(&ts); + return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; +} +unsigned monotonic_sec(void) +{ + struct timespec ts; + get_mono(&ts); + return ts.tv_sec; +} + +#else + +unsigned long long monotonic_ns(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000000ULL + tv.tv_usec * 1000; +} +unsigned long long monotonic_us(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000ULL + tv.tv_usec; +} +unsigned monotonic_sec(void) +{ + return time(NULL); +} + +#endif |
