<pre style='margin:0'>
Chris Jones (cjones051073) pushed a commit to branch master
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/88852aa8928004f1b02e40d80d924ccf8fc31195">https://github.com/macports/macports-legacy-support/commit/88852aa8928004f1b02e40d80d924ccf8fc31195</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 88852aa  Add support for CLOCK_MONOTONIC_RAW to clock_gettime
</span>88852aa is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 88852aa8928004f1b02e40d80d924ccf8fc31195
</span>Author: Chris Jones <cjones051073@icloud.com>
AuthorDate: Sun Mar 26 17:26:01 2023 +0100

<span style='display:block; white-space:pre;color:#404040;'>    Add support for CLOCK_MONOTONIC_RAW to clock_gettime
</span>---
 include/time.h     |  7 ++++---
 src/time.c         | 51 +++++++++++++++++++++++----------------------------
 test/test_time.cpp | 31 ++++++++++++++++++++-----------
 3 files changed, 47 insertions(+), 42 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/time.h b/include/time.h
</span><span style='display:block; white-space:pre;color:#808080;'>index 5ea5974..d042e24 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/time.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/time.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -44,10 +44,11 @@ __MP__END_DECLS
</span> #if __MP_LEGACY_SUPPORT_GETTIME__
 
 /* One define types and methods if not already defined. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if !defined(CLOCK_REALTIME) && !defined(CLOCK_MONOTONIC)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !defined(CLOCK_REALTIME) && !defined(CLOCK_MONOTONIC) && !defined(CLOCK_MONOTONIC_RAW)
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#define CLOCK_REALTIME  0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define CLOCK_MONOTONIC 6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define CLOCK_REALTIME      0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define CLOCK_MONOTONIC     6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define CLOCK_MONOTONIC_RAW 4
</span> typedef int clockid_t;
 
 __MP__BEGIN_DECLS
<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 bda2743..fd1dcf9 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;'>@@ -22,6 +22,10 @@
</span> #include <sys/time.h>
 #include <mach/mach_time.h>
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BILLION  1000000000L
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define MILLION  1000000L
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define THOUSAND 1000L
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> int clock_gettime( clockid_t clk_id, struct timespec *ts )
 {
   int ret = -1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -34,21 +38,24 @@ int clock_gettime( clockid_t clk_id, struct timespec *ts )
</span>       ts->tv_sec  = tv.tv_sec;
       ts->tv_nsec = tv.tv_usec * 1000;
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    else if ( CLOCK_MONOTONIC == clk_id )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    else if ( CLOCK_MONOTONIC == clk_id || CLOCK_MONOTONIC_RAW == clk_id )
</span>     {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-      const uint64_t t = mach_absolute_time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      const uint64_t clock = mach_absolute_time();
</span>       mach_timebase_info_data_t timebase;
       mach_timebase_info(&timebase);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-      const uint64_t tdiff = t * timebase.numer / timebase.denom;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      ts->tv_sec  = tdiff / 1000000000;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      ts->tv_nsec = tdiff % 1000000000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      uint64_t tdiff = clock * timebase.numer / timebase.denom;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if ( CLOCK_MONOTONIC == clk_id ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        tdiff = THOUSAND * ( tdiff / THOUSAND );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ts->tv_sec  = tdiff / BILLION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ts->tv_nsec = tdiff % BILLION;
</span>       ret = 0;
     }
   }
   return ret;
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-int clock_getres ( clockid_t clk_id, struct timespec *ts )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int clock_getres( clockid_t clk_id, struct timespec *ts )
</span> {
   int ret = -1;
   if ( ts )
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -58,32 +65,20 @@ int clock_getres ( clockid_t clk_id, struct timespec *ts )
</span>     {
       // return 1us precision
       ts->tv_sec  = 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-      ts->tv_nsec = 1000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ts->tv_nsec = THOUSAND;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ret         = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    else if ( CLOCK_MONOTONIC_RAW == clk_id )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      // return 1ns precision
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ts->tv_sec  = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ts->tv_nsec = 1;
</span>       ret         = 0;
     }
   }
   return ret;
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <mach/clock.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <mach/mach.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-int clock_gettime( int clk_id, struct timespec *ts )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  clock_serv_t cclock;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  mach_timespec_t mts;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  host_get_clock_service( mach_host_self(), clk_id, &cclock );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  const int ret = clock_get_time( cclock, &mts );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  mach_port_deallocate( mach_task_self(), cclock );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  if ( ts )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ts->tv_sec  = mts.tv_sec;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ts->tv_nsec = mts.tv_nsec;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  return ret;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-*/
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> #endif
 
 #if __MP_LEGACY_SUPPORT_TIMESPEC_GET__
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -92,9 +87,9 @@ int timespec_get(struct timespec *ts, int base)
</span> {
   switch (base) {
     case TIME_UTC:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-      if (clock_gettime(CLOCK_REALTIME, ts) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (clock_gettime(CLOCK_REALTIME, ts) == -1) {
</span>         return 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span>       return base;
 
     default:
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_time.cpp b/test/test_time.cpp
</span><span style='display:block; white-space:pre;color:#808080;'>index 83b2186..5019f25 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_time.cpp
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_time.cpp
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -28,20 +28,29 @@ inline void res( CLOCKID clk_id )
</span> 
 int main()
 {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  int c(0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  res(CLOCK_REALTIME);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  while ( ++c < 10 )
</span>   {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    std::cout << "CLOCK_REALTIME  " << time(CLOCK_REALTIME) << std::endl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int c =0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    res(CLOCK_REALTIME);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    while ( ++c < 10 )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      std::cout << "CLOCK_REALTIME ("<< CLOCK_REALTIME << ")      " << time(CLOCK_REALTIME) << std::endl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span>   }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-  c = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  res(CLOCK_MONOTONIC);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  while ( ++c < 10 )
</span>   {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    std::cout << "CLOCK_MONOTONIC " << time(CLOCK_MONOTONIC) << std::endl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int c = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    res(CLOCK_MONOTONIC);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    while ( ++c < 10 )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      std::cout << "CLOCK_MONOTONIC ("<< CLOCK_MONOTONIC << ")     " << time(CLOCK_MONOTONIC) << std::endl;
</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;'>+    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int c = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    res(CLOCK_MONOTONIC_RAW);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    while ( ++c < 10 )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      std::cout << "CLOCK_MONOTONIC_RAW ("<< CLOCK_MONOTONIC_RAW << ") " << time(CLOCK_MONOTONIC_RAW) << std::endl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span>   }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>   return 0;
 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span></pre><pre style='margin:0'>

</pre>