<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/8e3a750ba4e6f238d476c353c39ae6a549e08605">https://github.com/macports/macports-legacy-support/commit/8e3a750ba4e6f238d476c353c39ae6a549e08605</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 8e3a750ba4e6f238d476c353c39ae6a549e08605
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Fri Jan 17 15:45:26 2025 -0800
<span style='display:block; white-space:pre;color:#404040;'> Implement interim clock_gettime_nsec_np().
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Closes: https://trac.macports.org/ticket/61691
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Since a proper implementation of clock_gettime_nsec_np() would be
</span><span style='display:block; white-space:pre;color:#404040;'> significant work, and should be accompanied by some needed rework of
</span><span style='display:block; white-space:pre;color:#404040;'> time.c and test_time.c in general, for now we just provide a wrapper
</span><span style='display:block; white-space:pre;color:#404040;'> around clock_gettime(). This is functionally correct but suboptimal
</span><span style='display:block; white-space:pre;color:#404040;'> in performance.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> It also cleans up the scale factors, converting the fairly pointless
</span><span style='display:block; white-space:pre;color:#404040;'> THOUSAND to a number, removing the unused MILLIONS, and replacing
</span><span style='display:block; white-space:pre;color:#404040;'> BILLIONS with separate 32- and 64-bit versions, both now explictly
</span><span style='display:block; white-space:pre;color:#404040;'> unsigned.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> It also cleans up some include issues.
</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 all tests on all platforms, including added test.
</span>---
include/time.h | 4 ++++
src/time.c | 28 +++++++++++++++++++++-------
2 files changed, 25 insertions(+), 7 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 7fcefb5..087abfb 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;'>@@ -80,6 +80,10 @@ __MP__BEGIN_DECLS
</span> extern int clock_gettime( clockid_t clk_id, struct timespec *ts );
extern int clock_getres ( clockid_t clk_id, struct timespec *ts );
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__uint64_t clock_gettime_nsec_np(clockid_t __clock_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> __MP__END_DECLS
#endif /* __MPLS_SDK_SUPPORT_GETTIME__ */
<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 69e43e9..95f8ef1 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;'>@@ -1,5 +1,6 @@
</span> /*
* Copyright (c) 2018 Chris Jones <jonesc@macports.org>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2025 Frederick H. G. Wright II <fw@fwright.net>
</span> *
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -14,10 +15,13 @@
</span> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#include "time.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MP support header */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "MacportsLegacySupport.h"
</span>
#if __MPLS_LIB_SUPPORT_GETTIME__
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #include <sys/time.h>
#include <sys/sysctl.h>
#include <sys/resource.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -27,9 +31,17 @@
</span> #include <mach/mach_time.h>
#include <mach/thread_act.h>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#define BILLION 1000000000L
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define MILLION 1000000L
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define THOUSAND 1000L
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BILLION32 1000000000U
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BILLION64 1000000000ULL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Interim implementation of clock_gettime_nsec_np() as wrapper */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+uint64_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+clock_gettime_nsec_np(clockid_t clk_id)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct timespec ts;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (clock_gettime(clk_id, &ts)) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ts.tv_sec * BILLION64 + ts.tv_nsec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span>
int clock_gettime( clockid_t clk_id, struct timespec *ts )
{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -90,8 +102,8 @@ int clock_gettime( clockid_t clk_id, struct timespec *ts )
</span> if ( kr != KERN_SUCCESS ) { return kr; }
}
uint64_t tdiff = mach_absolute_time() * ( timebase.numer / timebase.denom );
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ts->tv_sec = tdiff / BILLION;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ts->tv_nsec = tdiff % BILLION;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ts->tv_sec = tdiff / BILLION32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ts->tv_nsec = tdiff % BILLION32;
</span> ret = 0;
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -110,7 +122,7 @@ 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 = THOUSAND;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ts->tv_nsec = 1000;
</span> ret = 0;
}
else if ( CLOCK_MONOTONIC_RAW == clk_id ||
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -131,6 +143,8 @@ int clock_getres( clockid_t clk_id, struct timespec *ts )
</span>
#if __MPLS_LIB_SUPPORT_TIMESPEC_GET__
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> int timespec_get(struct timespec *ts, int base)
{
switch (base) {
</pre><pre style='margin:0'>
</pre>