<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>