diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/time.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/libbb/time.c b/libbb/time.c index 7d3ac9183..850ac1542 100644 --- a/libbb/time.c +++ b/libbb/time.c @@ -10,8 +10,8 @@ #include "libbb.h" #if ENABLE_MONOTONIC_SYSCALL -#include <sys/syscall.h> +#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 @@ -20,30 +20,47 @@ /* 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)) + bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); +} +unsigned long long FAST_FUNC monotonic_ns(void) +{ + struct timespec ts; + get_mono(&ts); + return ts.tv_sec * 1000000000ULL + ts.tv_nsec; +} unsigned long long FAST_FUNC monotonic_us(void) { struct timespec ts; - if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) - bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); + get_mono(&ts); return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; } unsigned FAST_FUNC monotonic_sec(void) { struct timespec ts; - if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) - bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); + get_mono(&ts); return ts.tv_sec; } + #else + +unsigned long long FAST_FUNC monotonic_ns(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000000ULL + tv.tv_usec * 1000; +} unsigned long long FAST_FUNC monotonic_us(void) { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * 1000000ULL + tv.tv_usec; } - unsigned FAST_FUNC monotonic_sec(void) { return time(NULL); } + #endif |