<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/1c12e6d0d3a494ff9f8e46590cf446c5f565eb9c">https://github.com/macports/macports-legacy-support/commit/1c12e6d0d3a494ff9f8e46590cf446c5f565eb9c</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 1c12e6d0d3a494ff9f8e46590cf446c5f565eb9c
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Sun Jun 15 16:36:59 2025 -0700
<span style='display:block; white-space:pre;color:#404040;'> test_clocks: Add boottime checking and reporting.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This checks the boottime for obviously invalid values (later than the
</span><span style='display:block; white-space:pre;color:#404040;'> current time), and optionally reports the value. This value is used
</span><span style='display:block; white-space:pre;color:#404040;'> in computing the sleep offset.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> For now, we ignore any boottime error for test failure purposes, since
</span><span style='display:block; white-space:pre;color:#404040;'> the actual clock code has a workaround, and we don't want to induce
</span><span style='display:block; white-space:pre;color:#404040;'> unnecessary test failures. This will be changed to be treated as a
</span><span style='display:block; white-space:pre;color:#404040;'> test failure after the boottime bug is fixed.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'> Passes on all platforms.
</span><span style='display:block; white-space:pre;color:#404040;'> Includes expected report.
</span>---
test/test_clocks.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_clocks.c b/test/test_clocks.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 05fb1c7..f893b6d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_clocks.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_clocks.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -52,6 +52,7 @@
</span> #include <mach/mach_time.h>
#include <sys/param.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/sysctl.h>
</span> #include <sys/time.h>
/*
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -380,6 +381,7 @@ intsig(int signum)
</span> ++stopiter;
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Basic mach_time setup */
</span> static int
setup(int verbose)
{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -446,6 +448,46 @@ ts2nsec(timespec_t *ts)
</span> return ts->tv_sec * BILLION64 + ts->tv_nsec;
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Get boottime via sysctl() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+get_boottime(struct timeval *bt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t bt_len = sizeof(*bt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int bt_mib[] = {CTL_KERN, KERN_BOOTTIME};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size_t bt_miblen = sizeof(bt_mib) / sizeof(bt_mib[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bt->tv_usec = 0; /* In case OS doesn't store it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return sysctl(bt_mib, bt_miblen, bt, &bt_len, NULL, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Report and check boottime */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+check_boottime(int verbose)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct timeval bt, tod;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (get_boottime(&bt)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("Can't get boottime: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verbose) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf(" Boot time is %lld.%d\n", LL bt.tv_sec, bt.tv_usec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (gettimeofday(&tod, NULL)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("Can't get timeofday: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (tv2nsec(&bt) > tv2nsec(&tod)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("%s*** Boot time %lld.%d is later than timeofday %lld.%d\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verbose ? " " : "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ LL bt.tv_sec, bt.tv_usec, LL tod.tv_sec, tod.tv_usec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /* Version of usleep() that defends against signals */
static void
usleepx(useconds_t usecs)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2055,6 +2097,9 @@ main(int argc, char *argv[])
</span>
err |= check_invalid();
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* For now, ignore (but report) any boottime error */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (void) check_boottime(verbose && !quiet);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> get_sleepofs(&lastsleep);
if (verbose & !quiet) report_sleepofs(" Initial sleep offset", &lastsleep);
</pre><pre style='margin:0'>
</pre>