summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/systat/engine.c26
-rw-r--r--usr.bin/systat/engine.h4
-rw-r--r--usr.bin/systat/main.c11
3 files changed, 27 insertions, 14 deletions
diff --git a/usr.bin/systat/engine.c b/usr.bin/systat/engine.c
index 068174a74cc..84d3146534d 100644
--- a/usr.bin/systat/engine.c
+++ b/usr.bin/systat/engine.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: engine.c,v 1.28 2021/06/02 08:32:22 martijn Exp $ */
+/* $OpenBSD: engine.c,v 1.29 2021/07/02 15:34:16 millert Exp $ */
/*
* Copyright (c) 2001, 2007 Can Erkin Acar <canacar@openbsd.org>
*
@@ -27,6 +27,7 @@
#include <string.h>
#include <term.h>
#include <unistd.h>
+#include <math.h>
#include <err.h>
/* XXX These are defined in term.h and conflict with our variable names */
@@ -50,7 +51,9 @@ struct view_ent {
TAILQ_ENTRY(view_ent) entries;
};
-useconds_t udelay = 5000000;
+static struct timespec ts_delay = { 5, 0 };
+static struct itimerval it_delay = { { 0, 0 }, { 5, 0 } };
+
int dispstart = 0;
int humanreadable = 0;
int interactive = 1;
@@ -1355,7 +1358,7 @@ engine_loop(int countmax)
read_view();
need_sort = 1;
gotsig_alarm = 0;
- ualarm(udelay, 0);
+ setitimer(ITIMER_REAL, &it_delay, NULL);
}
if (need_sort) {
@@ -1366,7 +1369,7 @@ engine_loop(int countmax)
/* XXX if sort took too long */
if (gotsig_alarm) {
gotsig_alarm = 0;
- ualarm(udelay, 0);
+ setitimer(ITIMER_REAL, &it_delay, NULL);
}
}
@@ -1408,7 +1411,7 @@ engine_loop(int countmax)
if (interactive && need_update == 0)
keyboard();
else if (interactive == 0)
- usleep(udelay);
+ nanosleep(&ts_delay, NULL);
}
if (rawmode == 0)
@@ -1457,3 +1460,16 @@ check_termcap(void)
return(0);
}
+
+void
+refresh_delay(double delay)
+{
+ double secs, frac;
+
+ frac = modf(delay, &secs);
+ ts_delay.tv_sec = secs;
+ ts_delay.tv_nsec = frac * 1000000000.0;
+ if (!timespecisset(&ts_delay))
+ ts_delay.tv_nsec = 1000000000;
+ TIMESPEC_TO_TIMEVAL(&it_delay.it_value, &ts_delay);
+}
diff --git a/usr.bin/systat/engine.h b/usr.bin/systat/engine.h
index c8239b5bfbd..0d0b970f4ef 100644
--- a/usr.bin/systat/engine.h
+++ b/usr.bin/systat/engine.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: engine.h,v 1.13 2021/06/02 08:32:22 martijn Exp $ */
+/* $OpenBSD: engine.h,v 1.14 2021/07/02 15:34:16 millert Exp $ */
/*
* Copyright (c) 2001, 2007 Can Erkin Acar <canacar@openbsd.org>
*
@@ -145,6 +145,7 @@ void show_order(void);
void setup_term(int maxpr);
int check_termcap(void);
+void refresh_delay(double delay);
void engine_initialize(void);
void engine_loop(int countmax);
@@ -156,7 +157,6 @@ const char *message_set(const char *msg);
void foreach_view(void (*callback)(field_view *));
extern int sortdir;
-extern useconds_t udelay;
extern int dispstart;
extern int humanreadable;
extern int interactive;
diff --git a/usr.bin/systat/main.c b/usr.bin/systat/main.c
index 1a67a23e3b8..48b42ea0031 100644
--- a/usr.bin/systat/main.c
+++ b/usr.bin/systat/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.74 2021/06/02 08:32:22 martijn Exp $ */
+/* $OpenBSD: main.c,v 1.75 2021/07/02 15:34:16 millert Exp $ */
/*
* Copyright (c) 2001, 2007 Can Erkin Acar
* Copyright (c) 2001 Daniel Hartmeier
@@ -332,7 +332,7 @@ cmd_delay(const char *buf)
if (errstr != NULL)
error("s: \"%s\": delay value is %s", buf, errstr);
else {
- udelay = (useconds_t)(del * 1000000);
+ refresh_delay(del);
gotsig_alarm = 1;
naptime = del;
}
@@ -557,11 +557,8 @@ main(int argc, char *argv[])
errx(1, "\"%s\": delay value is %s", argv[1], errstr);
}
- udelay = (useconds_t)(delay * 1000000.0);
- if (udelay < 1)
- udelay = 1;
-
- naptime = (double)udelay / 1000000.0;
+ refresh_delay(delay);
+ naptime = delay;
gethostname(hostname, sizeof (hostname));
gethz();