From 920382518fd40768b1c7b61bd6fd56f8dd620cca Mon Sep 17 00:00:00 2001 From: Jacques de Laval Date: Thu, 30 Jan 2020 15:14:04 +0100 Subject: [PATCH] Switch to using nanosleep in favour of sleep The remaining sleep time returned by sleep is not accurate enough to be used as a means to achieve "signal safe"-sleep. nanosleep can be used in similar fashion instead and is granular enough for our purposes. This issue was identified during reboot, when Finit is bombarded with SIGCHLD, aborting the sleep that we do to give daemons a chance to shut down gracefully. The total delay ended up being less than a second when in fact two seconds were the intended delay. --- src/util.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/util.c b/src/util.c index 59fd3d1c..5803f6d9 100644 --- a/src/util.c +++ b/src/util.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include /* sysinfo() */ #include /* strlcat() */ @@ -105,7 +106,11 @@ int strtobytes(char *arg) void do_sleep(unsigned int sec) { - while ((sec = sleep(sec))) + struct timespec requested_sleep = { + .tv_sec = sec, + .tv_nsec = 0, + }; + while (nanosleep(&requested_sleep, &requested_sleep)) ; }