]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Please, don't add this file to libcommon because clock_gettime() requires | |
3 | * -lrt on systems with old libc. | |
4 | */ | |
5 | #include <time.h> | |
6 | #include <signal.h> | |
7 | #ifdef HAVE_SYSINFO | |
8 | #include <sys/sysinfo.h> | |
9 | #endif | |
10 | #include <sys/time.h> | |
11 | ||
12 | #include "c.h" | |
13 | #include "monotonic.h" | |
14 | ||
15 | int get_boot_time(struct timeval *boot_time) | |
16 | { | |
17 | #ifdef CLOCK_BOOTTIME | |
18 | struct timespec hires_uptime; | |
19 | struct timeval lores_uptime; | |
20 | #endif | |
21 | struct timeval now; | |
22 | #ifdef HAVE_SYSINFO | |
23 | struct sysinfo info; | |
24 | #endif | |
25 | ||
26 | if (gettimeofday(&now, NULL) != 0) | |
27 | return -errno; | |
28 | #ifdef CLOCK_BOOTTIME | |
29 | if (clock_gettime(CLOCK_BOOTTIME, &hires_uptime) == 0) { | |
30 | TIMESPEC_TO_TIMEVAL(&lores_uptime, &hires_uptime); | |
31 | timersub(&now, &lores_uptime, boot_time); | |
32 | return 0; | |
33 | } | |
34 | #endif | |
35 | #ifdef HAVE_SYSINFO | |
36 | /* fallback */ | |
37 | if (sysinfo(&info) != 0) | |
38 | return -errno; | |
39 | ||
40 | boot_time->tv_sec = now.tv_sec - info.uptime; | |
41 | boot_time->tv_usec = 0; | |
42 | return 0; | |
43 | #else | |
44 | return -ENOSYS; | |
45 | #endif | |
46 | } | |
47 | ||
48 | int gettime_monotonic(struct timeval *tv) | |
49 | { | |
50 | #ifdef CLOCK_MONOTONIC | |
51 | /* Can slew only by ntp and adjtime */ | |
52 | int ret; | |
53 | struct timespec ts; | |
54 | ||
55 | /* Linux specific, can't slew */ | |
56 | if (!(ret = clock_gettime(UL_CLOCK_MONOTONIC, &ts))) { | |
57 | tv->tv_sec = ts.tv_sec; | |
58 | tv->tv_usec = ts.tv_nsec / 1000; | |
59 | } | |
60 | return ret; | |
61 | #else | |
62 | return gettimeofday(tv, NULL); | |
63 | #endif | |
64 | } | |
65 | ||
66 |