<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/b9c0d65e4d2b4763a8f4a31ae630fab48733dd8e">https://github.com/macports/macports-legacy-support/commit/b9c0d65e4d2b4763a8f4a31ae630fab48733dd8e</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit b9c0d65e4d2b4763a8f4a31ae630fab48733dd8e
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Wed Apr 23 14:15:25 2025 -0700
<span style='display:block; white-space:pre;color:#404040;'> time.c: Fix bug in pre-10.10 thread time.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> See the comment for details.
</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;'> Fixes flakiness in relevant new test.
</span>---
src/time.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 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 a25ad6b..e0b928a 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;'>@@ -349,6 +349,17 @@ mach2timespec(uint64_t mach_time, struct timespec *ts)
</span> /*
* Get the best available thread time, using the syscall on 10.10+,
* but falling back to thread_info() on <10.10.
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * In the latter case, a thread which has just started may not yet have
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * nonzero usage (in microsecond resolution). This is not a problem in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the timespec case, but is a problem in the nanosecond case, since a zero
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * value indicates an error. To get around this, we report a non-error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * zero nanosecond result as one nanosecond. It's impossible for this to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * exceed any later non-error result, hence it's monotonic.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Out of extreme paranoia, we apply the same treatment to the timespec
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * case, so that using it after using the nanosecond version can't show
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * a backstep.
</span> */
#if __MPLS_TARGET_OSVER < 101000
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -371,11 +382,14 @@ static inline uint64_t
</span> get_thread_usage_ns(void)
{
thread_basic_info_data_t info;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ uint64_t nanos;
</span>
if (get_thread_usage(&info)) return 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return (info.user_time.seconds + info.system_time.seconds) * BILLION64
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- + (info.user_time.microseconds + info.system_time.microseconds) * 1000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ nanos = (info.user_time.seconds + info.system_time.seconds) * BILLION64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ + (info.user_time.microseconds + info.system_time.microseconds)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 1000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return nanos ? nanos : 1;
</span> }
/* Same but returning as timespec */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -393,6 +407,8 @@ get_thread_usage_ts(struct timespec *ts)
</span> ++ts->tv_sec;
ts->tv_nsec -= BILLION32;
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!ts->tv_sec && !ts->tv_nsec) ts->tv_nsec = 1;
</span> return 0;
}
</pre><pre style='margin:0'>
</pre>