From: Michael Stapelberg Date: Fri, 29 Jan 2010 23:02:17 +0000 (+0100) Subject: Instead of a relative sleep(1), sleep until the full second X-Git-Tag: 2.1~11 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=18c4b9866d395720077e815d85755a8ac54354ca;p=i3%2Fi3status 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. --- 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); } }