On Thu, 01 Jul 2021 08:14:51 -0600, "Todd C. Miller" wrote:
> Aha, I see. It is because delay can be a float.
Here's a diff to use nanosleep/setitimer instead of usleep/ualarm.
Is it worth it?
- todd
Index: usr.bin/systat/engine.c
===================================================================
RCS file: /cvs/src/usr.bin/systat/engine.c,v
retrieving revision 1.28
diff -u -p -u -r1.28 engine.c
--- usr.bin/systat/engine.c 2 Jun 2021 08:32:22 -0000 1.28
+++ usr.bin/systat/engine.c 1 Jul 2021 14:49:41 -0000
@@ -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)
@@ -1456,4 +1459,17 @@ check_termcap(void)
return(1);
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);
}
Index: usr.bin/systat/engine.h
===================================================================
RCS file: /cvs/src/usr.bin/systat/engine.h,v
retrieving revision 1.13
diff -u -p -u -r1.13 engine.h
--- usr.bin/systat/engine.h 2 Jun 2021 08:32:22 -0000 1.13
+++ usr.bin/systat/engine.h 1 Jul 2021 14:30:40 -0000
@@ -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;
Index: usr.bin/systat/main.c
===================================================================
RCS file: /cvs/src/usr.bin/systat/main.c,v
retrieving revision 1.74
diff -u -p -u -r1.74 main.c
--- usr.bin/systat/main.c 2 Jun 2021 08:32:22 -0000 1.74
+++ usr.bin/systat/main.c 1 Jul 2021 14:43:30 -0000
@@ -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();