aboutsummaryrefslogtreecommitdiffstats
path: root/tests/clock-back.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/clock-back.c')
-rw-r--r--tests/clock-back.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/tests/clock-back.c b/tests/clock-back.c
index 50870ca..2ab83e0 100644
--- a/tests/clock-back.c
+++ b/tests/clock-back.c
@@ -1,8 +1,12 @@
#define _GNU_SOURCE
-/* LD_PRELOAD: the wall clock (CLOCK_REALTIME) set back an hour from
- * CLOCK_BACK_MS milliseconds (200 unless given) after the process first
- * asks for it, as a person or NTP may set it. A program's timers must go on
- * all the same: they wait on the monotonic clock (tests/check.py). */
+/* LD_PRELOAD: the wall clock (CLOCK_REALTIME) set back an hour (moved
+ * CLOCK_SHIFT_S seconds: -3600 unless given) from CLOCK_BACK_MS milliseconds
+ * (200 unless given) after the process first asks for it, as a person or NTP
+ * may set it. Only what the process reads moves, so a wait until a deadline
+ * read from the wall clock ends at once (set back) or lasts an hour (set
+ * forward), as one would with the clock set the other way after it was read.
+ * A program's timers and waits must go on all the same: they count on the
+ * monotonic clock (tests/check.py). */
#include <dlfcn.h>
#include <stdlib.h>
#include <time.h>
@@ -17,7 +21,7 @@ int clock_gettime(clockid_t id, struct timespec *t) {
real(CLOCK_MONOTONIC, &now);
long long ms = (long long)now.tv_sec * 1000 + now.tv_nsec / 1000000;
if (began < 0) began = ms;
- const char *after = getenv("CLOCK_BACK_MS");
- if (ms - began >= (after ? atoll(after) : 200)) t->tv_sec -= 3600;
+ const char *after = getenv("CLOCK_BACK_MS"), *shift = getenv("CLOCK_SHIFT_S");
+ if (ms - began >= (after ? atoll(after) : 200)) t->tv_sec += shift ? atoll(shift) : -3600;
return result;
}