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