<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/1abff6ed8b9ba570ed836906485a06e33e7ec172">https://github.com/macports/macports-legacy-support/commit/1abff6ed8b9ba570ed836906485a06e33e7ec172</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 1abff6e  clock_gettime: cache timebase - On versions of osx before 10.12, mach_timebase_info is a direct syscall (see dyld-239.3/glue.c#L434) which is order of magnitudes slower than the subsequent mach_absolute_time() call. Hence it's better to just cache it after the first call. - Since 10.12+, Apple also realized this and began caching mach_timebase_info calls at the libc layer (https://opensource.apple.com/source/xnu/xnu-3789.41.3/libsyscall/wrappers/mach_timebase_info.c.auto.html)
</span>1abff6e is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 1abff6ed8b9ba570ed836906485a06e33e7ec172
</span>Author: krackers <krackers@users.noreply.github.com>
AuthorDate: Sun Jan 22 02:21:09 2023 -0800

<span style='display:block; white-space:pre;color:#404040;'>    clock_gettime: cache timebase
</span><span style='display:block; white-space:pre;color:#404040;'>    - On versions of osx before 10.12, mach_timebase_info is a direct syscall (see dyld-239.3/glue.c#L434) which is order of magnitudes slower than the subsequent mach_absolute_time() call. Hence it's better to just cache it after the first call.
</span><span style='display:block; white-space:pre;color:#404040;'>    - Since 10.12+, Apple also realized this and began caching mach_timebase_info calls at the libc layer (https://opensource.apple.com/source/xnu/xnu-3789.41.3/libsyscall/wrappers/mach_timebase_info.c.auto.html)
</span>---
 src/time.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/time.c b/src/time.c
</span><span style='display:block; white-space:pre;color:#808080;'>index fd1dcf9..c1b8036 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/time.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/time.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -31,7 +31,7 @@ int clock_gettime( clockid_t clk_id, struct timespec *ts )
</span>   int ret = -1;
   if ( ts )
   {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if      ( CLOCK_REALTIME == clk_id )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if ( CLOCK_REALTIME == clk_id )
</span>     {
       struct timeval tv;
       ret = gettimeofday(&tv, NULL);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -40,10 +40,12 @@ int clock_gettime( clockid_t clk_id, struct timespec *ts )
</span>     }
     else if ( CLOCK_MONOTONIC == clk_id || CLOCK_MONOTONIC_RAW == clk_id )
     {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-      const uint64_t clock = mach_absolute_time();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      mach_timebase_info_data_t timebase;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      mach_timebase_info(&timebase);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      uint64_t tdiff = clock * timebase.numer / timebase.denom;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      const uint64_t t = mach_absolute_time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      static mach_timebase_info_data_t timebase;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (timebase.numer == 0 || timebase.denom == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        mach_timebase_info(&timebase);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      const uint64_t tdiff = t * timebase.numer / timebase.denom;
</span>       if ( CLOCK_MONOTONIC == clk_id ) {
         tdiff = THOUSAND * ( tdiff / THOUSAND );
       }
</pre><pre style='margin:0'>

</pre>