use /proc/uptime for uptime when now_boottime_usec() differs; fixes #3393
Costa Tsaousis (ktsaou) committed
Feb 19, 2018 at 01:23 UTC
fe3dfd60a97d67fbab87f0d6dacd929dcac70f7b
1 file changed
+33
-9
src/proc_uptime.c
+33
-9
@@ -1,13 +1,6 @@
1
#include "common.h"
2
3
-int do_proc_uptime(int update_every, usec_t dt) {
4
- (void)dt;
5
-
6
- collected_number uptime = 0;
7
-
8
-#ifdef CLOCK_BOOTTIME_IS_AVAILABLE
9
- uptime = now_boottime_usec() / 1000;
10
-#else
3
+static collected_number read_proc_uptime(void) {
4
static procfile *ff = NULL;
5
6
if(unlikely(!ff)) {
@@ -32,7 +25,38 @@ int do_proc_uptime(int update_every, usec_t dt) {
25
return 1;
26
}
27
35
- uptime = (collected_number)(strtold(procfile_lineword(ff, 0, 0), NULL) * 1000.0);
28
+ return (collected_number)(strtold(procfile_lineword(ff, 0, 0), NULL) * 1000.0);
29
+}
30
+
31
+int do_proc_uptime(int update_every, usec_t dt) {
32
+ (void)dt;
33
+
34
+ collected_number uptime;
35
+
36
+#ifdef CLOCK_BOOTTIME_IS_AVAILABLE
37
+ static int use_boottime = -1;
38
+
39
+ if(unlikely(use_boottime == -1)) {
40
+ long long delta = (long long)(now_boottime_usec() / 1000) - (long long)read_proc_uptime();
41
+ if(delta < 0) delta = -delta;
42
+
43
+ if(delta <= 1000) {
44
+ info("Using now_boottime_usec() for uptime (dt is %lld ms)", delta);
45
+ use_boottime = 1;
46
+ }
47
+ else {
48
+ info("Using /proc/uptime for uptime (dt is %lld ms)", delta);
49
+ use_boottime = 0;
50
+ }
51
+ }
52
+
53
+ if(use_boottime)
54
+ uptime = now_boottime_usec() / 1000;
55
+ else
56
+ uptime = read_proc_uptime();
57
+
58
+#else
59
+ uptime = read_proc_uptime();
60
#endif
61
62
// --------------------------------------------------------------------