From d212d5ae2ce0c749f7e4df4993f2352d7b01590d Mon Sep 17 00:00:00 2001 From: gramps Date: Thu, 10 Sep 2026 08:35:14 -0700 Subject: [PATCH] tools: WSL ticker for timing-verification takes Absolute-deadline 1s marker (CLOCK_REALTIME clock_nanosleep, user-readable timestamp + drift per second) so a recording's real-time pace is checkable on screen. Deadline pacing mirrors game-loop/OBS canon - stackoverflow.com/questions/5441464. Build: gcc -O2 -o ticker ticker.c --- tools/ticker | Bin 0 -> 16336 bytes tools/ticker.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 tools/ticker create mode 100644 tools/ticker.c diff --git a/tools/ticker b/tools/ticker new file mode 100644 index 0000000000000000000000000000000000000000..9b49fa0c601d796e24f5d77c30e7117d459c9fd0 GIT binary patch literal 16336 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 literal 0 HcmV?d00001 diff --git a/tools/ticker.c b/tools/ticker.c new file mode 100644 index 0000000..107fbe0 --- /dev/null +++ b/tools/ticker.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include + +static volatile sig_atomic_t g_run = 1; +static void stop(int s){ (void)s; g_run = 0; } + +static double mono(void){ + struct timespec t; clock_gettime(CLOCK_MONOTONIC, &t); + return (double)t.tv_sec + (double)t.tv_nsec/1e9; +} + +int main(void){ + signal(SIGINT, stop); signal(SIGTERM, stop); + struct timespec base; clock_gettime(CLOCK_REALTIME, &base); + base.tv_nsec = 0; base.tv_sec += 1; + double t0 = mono(); + uint64_t tick = 0; + + while (g_run){ + struct timespec dl = base; + dl.tv_sec += (time_t)tick; + int rc = clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &dl, NULL); + if (rc != 0 && rc != EINTR) break; + double now = mono(); + double drift = (now - t0 - (double)tick) * 1e3; + struct timespec r; clock_gettime(CLOCK_REALTIME, &r); + struct tm mv; localtime_r(&r.tv_sec, &mv); + printf("[%05" PRIu64 "] t+%09.6fs drift %+7.2fms %02d:%02d:%02d\n", + tick, now - t0, drift, mv.tm_hour, mv.tm_min, mv.tm_sec); + fflush(stdout); + tick++; + } + return 0; +}