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 @@ | |||
10 | #include "libbb.h" | 10 | #include "libbb.h" |
11 | 11 | ||
12 | #if ENABLE_MONOTONIC_SYSCALL | 12 | #if ENABLE_MONOTONIC_SYSCALL |
13 | #include <sys/syscall.h> | ||
14 | 13 | ||
14 | #include <sys/syscall.h> | ||
15 | /* Old glibc (< 2.3.4) does not provide this constant. We use syscall | 15 | /* Old glibc (< 2.3.4) does not provide this constant. We use syscall |
16 | * directly so this definition is safe. */ | 16 | * directly so this definition is safe. */ |
17 | #ifndef CLOCK_MONOTONIC | 17 | #ifndef CLOCK_MONOTONIC |
@@ -20,30 +20,47 @@ | |||
20 | 20 | ||
21 | /* libc has incredibly messy way of doing this, | 21 | /* libc has incredibly messy way of doing this, |
22 | * typically requiring -lrt. We just skip all this mess */ | 22 | * typically requiring -lrt. We just skip all this mess */ |
23 | static void get_mono(struct timespec *ts) | ||
24 | { | ||
25 | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts)) | ||
26 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); | ||
27 | } | ||
28 | unsigned long long FAST_FUNC monotonic_ns(void) | ||
29 | { | ||
30 | struct timespec ts; | ||
31 | get_mono(&ts); | ||
32 | return ts.tv_sec * 1000000000ULL + ts.tv_nsec; | ||
33 | } | ||
23 | unsigned long long FAST_FUNC monotonic_us(void) | 34 | unsigned long long FAST_FUNC monotonic_us(void) |
24 | { | 35 | { |
25 | struct timespec ts; | 36 | struct timespec ts; |
26 | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) | 37 | get_mono(&ts); |
27 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); | ||
28 | return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; | 38 | return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000; |
29 | } | 39 | } |
30 | unsigned FAST_FUNC monotonic_sec(void) | 40 | unsigned FAST_FUNC monotonic_sec(void) |
31 | { | 41 | { |
32 | struct timespec ts; | 42 | struct timespec ts; |
33 | if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts)) | 43 | get_mono(&ts); |
34 | bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); | ||
35 | return ts.tv_sec; | 44 | return ts.tv_sec; |
36 | } | 45 | } |
46 | |||
37 | #else | 47 | #else |
48 | |||
49 | unsigned long long FAST_FUNC monotonic_ns(void) | ||
50 | { | ||
51 | struct timeval tv; | ||
52 | gettimeofday(&tv, NULL); | ||
53 | return tv.tv_sec * 1000000000ULL + tv.tv_usec * 1000; | ||
54 | } | ||
38 | unsigned long long FAST_FUNC monotonic_us(void) | 55 | unsigned long long FAST_FUNC monotonic_us(void) |
39 | { | 56 | { |
40 | struct timeval tv; | 57 | struct timeval tv; |
41 | gettimeofday(&tv, NULL); | 58 | gettimeofday(&tv, NULL); |
42 | return tv.tv_sec * 1000000ULL + tv.tv_usec; | 59 | return tv.tv_sec * 1000000ULL + tv.tv_usec; |
43 | } | 60 | } |
44 | |||
45 | unsigned FAST_FUNC monotonic_sec(void) | 61 | unsigned FAST_FUNC monotonic_sec(void) |
46 | { | 62 | { |
47 | return time(NULL); | 63 | return time(NULL); |
48 | } | 64 | } |
65 | |||
49 | #endif | 66 | #endif |