]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Darwin libcproc: fix for VG_(read_millisecond_timer)
authorPaul Floyd <pjfloyd@wanadoo.fr>
Thu, 11 Dec 2025 08:03:08 +0000 (09:03 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Thu, 11 Dec 2025 08:03:08 +0000 (09:03 +0100)
This function had some peculiar workaround for how the result
was handled. That peculiarity seems to have gone away (some time
before Darwin 17). Now use 'normal' handling for the result for
Darwin 17+.

This was causing some DRD timed mutex testcases to fail.

Code copied from Louis Brunner.

coregrind/m_libcproc.c

index 7c4d6acc9d69307862e5fbd142e2449a99dd4db6..4c4b96eefbabf8304a2bc55aafe065eddc3aa902 100644 (file)
@@ -1052,7 +1052,15 @@ UInt VG_(read_millisecond_timer) ( void )
      struct vki_timeval tv_now = { 0, 0 };
      res = VG_(do_syscall2)(__NR_gettimeofday, (UWord)&tv_now, (UWord)NULL);
      vg_assert(! sr_isError(res));
+#   if DARWIN_VERS >= DARWIN_10_13
+     now = tv_now.tv_sec * 1000000ULL + tv_now.tv_usec;
+#   else
+     // Weird: it seems that gettimeofday() doesn't fill in the timeval, but
+     // rather returns the tv_sec as the low 32 bits of the result and the
+     // tv_usec as the high 32 bits of the result.  (But the timeval cannot be
+     // NULL!)  See bug 200990.
      now = sr_Res(res) * 1000000ULL + sr_ResHI(res);
+#endif
    }
 
 #  else