From 18c4b9866d395720077e815d85755a8ac54354ca Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 30 Jan 2010 00:02:17 +0100 Subject: [PATCH] Instead of a relative sleep(1), sleep until the full second MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This makes sure you don’t lag behind up to nearly one second in the worst case, depending on the start time of your i3status. --- i3status.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/i3status.c b/i3status.c index f2d055d..59fedf8 100644 --- a/i3status.c +++ b/i3status.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include "i3status.h" @@ -186,6 +188,8 @@ int main(int argc, char *argv[]) { if ((general_socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1) die("Could not create socket\n"); + int interval = cfg_getint(cfg_general, "interval"); + while (1) { for (j = 0; j < cfg_size(cfg, "order"); j++) { if (j > 0) @@ -223,6 +227,13 @@ int main(int argc, char *argv[]) { printf("\n"); fflush(stdout); - sleep(cfg_getint(cfg_general, "interval")); + /* To provide updates on every full second (as good as possible) + * we don’t use sleep(interval) but we sleep until the next + * second (with microsecond precision) plus (interval-1) + * seconds. */ + struct timeval current_time; + gettimeofday(¤t_time, NULL); + struct timespec ts = {interval - 1, (10e5 - current_time.tv_usec) * 1000}; + nanosleep(&ts, NULL); } } -- 2.39.2