From 18c4b9866d395720077e815d85755a8ac54354ca Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 30 Jan 2010 00:02:17 +0100 Subject: Instead of a relative sleep(1), sleep until the full second 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(-) (limited to 'i3status.c') 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); } } -- cgit v1.2.3