From a21cbcb876be978fa69925a758fcb12c4153e960 Mon Sep 17 00:00:00 2001 From: Andre Oppermann Date: Mon, 17 Oct 2005 15:37:22 +0000 Subject: [PATCH] Obtain true uptime through clock_gettime(CLOCK_MONOTONIC, struct *timespec) instead of subtracting 'bootime' from 'now'. Sponsored by: TCP/IP Optimization Fundraise 2005 --- usr.bin/vmstat/vmstat.c | 20 ++++---------------- usr.bin/w/w.c | 12 +++--------- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c index f52f7bfdf148..605319c68dcd 100644 --- a/usr.bin/vmstat/vmstat.c +++ b/usr.bin/vmstat/vmstat.c @@ -396,26 +396,14 @@ getdrivedata(char **argv) static long getuptime(void) { - static struct timeval boottime; - static time_t now; + struct timespec sp; time_t uptime; - if (boottime.tv_sec == 0) { - if (kd != NULL) { - kread(X_BOOTTIME, &boottime, sizeof(boottime)); - } else { - size_t size; - - size = sizeof(boottime); - mysysctl("kern.boottime", &boottime, &size, NULL, 0); - if (size != sizeof(boottime)) - errx(1, "kern.boottime size mismatch"); - } - } - (void)time(&now); - uptime = now - boottime.tv_sec; + (void)clock_gettime(CLOCK_MONOTONIC, &sp); + uptime = sp.tv_sec; if (uptime <= 0 || uptime > 60*60*24*365*10) errx(1, "time makes no sense; namelist must be wrong"); + return(uptime); } diff --git a/usr.bin/w/w.c b/usr.bin/w/w.c index 72559ba9b71f..8f69ab678563 100644 --- a/usr.bin/w/w.c +++ b/usr.bin/w/w.c @@ -424,9 +424,8 @@ pr_header(time_t *nowp, int nusers) { double avenrun[3]; time_t uptime; + struct timespec tp; int days, hrs, i, mins, secs; - int mib[2]; - size_t size; char buf[256]; /* @@ -437,14 +436,9 @@ pr_header(time_t *nowp, int nusers) (void)printf("%s ", buf); /* * Print how long system has been up. - * (Found by looking getting "boottime" from the kernel) */ - mib[0] = CTL_KERN; - mib[1] = KERN_BOOTTIME; - size = sizeof(boottime); - if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && - boottime.tv_sec != 0) { - uptime = now - boottime.tv_sec; + if (clock_gettime(CLOCK_MONOTONIC, &tp) != -1) { + uptime = tp.tv_sec; if (uptime > 60) uptime += 30; days = uptime / 86400;