]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
time-util: use clock_nanosleep() rather than nanosleep()
authorLennart Poettering <lennart@poettering.net>
Wed, 20 Sep 2023 09:18:02 +0000 (11:18 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 20 Sep 2023 09:22:20 +0000 (11:22 +0200)
nanosleep() is kinda broken since it sleeps in the CLOCK_REALTIME clock,
i.e. is subject to time changes.

Let's use clock_nanosleep() instead with CLOCK_MONOTONIC, which is
really the only thing that makes sense.

src/basic/time-util.h

index b648a3b59ea1defbe8e87bbe954656be3059d2d7..73ba8b9544dfd1c15ff0871e585613ea38799d05 100644 (file)
@@ -214,10 +214,13 @@ static inline usec_t usec_sub_signed(usec_t timestamp, int64_t delta) {
 
 static inline int usleep_safe(usec_t usec) {
         /* usleep() takes useconds_t that is (typically?) uint32_t. Also, usleep() may only support the
-         * range [0, 1000000]. See usleep(3). Let's override usleep() with nanosleep(). */
+         * range [0, 1000000]. See usleep(3). Let's override usleep() with clock_nanosleep().
+         *
+         * ⚠️ Note we are not using plain nanosleep() here, since that operates on CLOCK_REALTIME, not
+         *    CLOCK_MONOTONIC! */
 
         // FIXME: use RET_NERRNO() macro here. Currently, this header cannot include errno-util.h.
-        return nanosleep(TIMESPEC_STORE(usec), NULL) < 0 ? -errno : 0;
+        return clock_nanosleep(CLOCK_MONOTONIC, 0, TIMESPEC_STORE(usec), NULL) < 0 ? -errno : 0;
 }
 
 /* The last second we can format is 31. Dec 9999, 1s before midnight, because otherwise we'd enter 5 digit