/* 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 /* 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