[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH glibc v3] mach: Add CLOCK_MONOTONIC case in clock_gettime()
From: |
Zhaoming Luo |
Subject: |
[RFC PATCH glibc v3] mach: Add CLOCK_MONOTONIC case in clock_gettime() |
Date: |
Mon, 6 Jan 2025 12:39:07 +0800 |
mach: Add CLOCK_MONOTONIC case in clock_gettime()
The Mach RPC host_get_uptime64() is implemented. It returns the elapsed time
value since bootup. See
https://git.savannah.gnu.org/cgit/hurd/gnumach.git/commit/?id=fc494bfe3fb6363e1077dc035eb119970d84a9d1
In this patch, the RPC is used to implement the monotonic clock for
mach.
* config.h.in: Add HAVE_HOST_GET_UPTIME64 config entry
* sysdeps/mach/clock_gettime.c: Add CLOCK_MONOTONIC case
* sysdeps/mach/configure: Check the existence of host_get_uptime64 RPC
* sysdeps/mach/configure.ac: Check the existence of host_get_uptime64 RPC
---
config.h.in | 3 +++
sysdeps/mach/clock_gettime.c | 25 +++++++++++++++++++++++++
sysdeps/mach/configure | 30 ++++++++++++++++++++++++++++++
sysdeps/mach/configure.ac | 2 ++
4 files changed, 60 insertions(+)
diff --git a/config.h.in b/config.h.in
index c26f98ccd6..cdbd555366 100644
--- a/config.h.in
+++ b/config.h.in
@@ -163,6 +163,9 @@
/* Mach specific: define if the `host_page_size' RPC is available. */
#undef HAVE_HOST_PAGE_SIZE
+/* Mach specific: define if the `host_get_uptime64' RPC is available. */
+#undef HAVE_HOST_GET_UPTIME64
+
/* Mach specific: define if the `thread_set_name' RPC is available. */
#undef HAVE_MACH_THREAD_SET_NAME
diff --git a/sysdeps/mach/clock_gettime.c b/sysdeps/mach/clock_gettime.c
index 6fffad39f5..b29acab908 100644
--- a/sysdeps/mach/clock_gettime.c
+++ b/sysdeps/mach/clock_gettime.c
@@ -20,6 +20,7 @@
#include <mach.h>
#include <assert.h>
#include <shlib-compat.h>
+#include <mach/mig_errors.h>
/* Get the current time of day, putting it into *TS.
Returns 0 on success, -1 on errors. */
@@ -31,6 +32,30 @@ __clock_gettime (clockid_t clock_id, struct timespec *ts)
switch (clock_id) {
+ case CLOCK_MONOTONIC:
+/* If HAVE_HOST_GET_UPTIME64 is not defined, CLOCK_MONOTONIC will be equivalent
+ to CLOCK_REALTIME. */
+#ifdef HAVE_HOST_GET_UPTIME64
+ {
+ time_value64_t tv;
+ err = __host_get_uptime64 (__mach_host_self (), &tv);
+
+ if (err)
+ {
+ if (err == MIG_BAD_ID)
+ {
+ /* Not supported by the running kernel. */
+ __set_errno (EINVAL);
+ }
+ else
+ __set_errno (err);
+ return -1;
+ }
+ TIME_VALUE64_TO_TIMESPEC (&tv, ts);
+ return 0;
+ }
+#endif
+
case CLOCK_REALTIME:
{
/* __host_get_time can only fail if passed an invalid host_t.
diff --git a/sysdeps/mach/configure b/sysdeps/mach/configure
index abfe084fda..8aa6bbb18b 100644
--- a/sysdeps/mach/configure
+++ b/sysdeps/mach/configure
@@ -461,6 +461,36 @@ if test $libc_cv_mach_rpc_host_page_size = yes; then
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for host_get_uptime64
in mach_host.defs" >&5
+printf %s "checking for host_get_uptime64 in mach_host.defs... " >&6; }
+if test ${libc_cv_mach_rpc_host_get_uptime64+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <mach/mach_host.defs>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP_TRADITIONAL "host_get_uptime64" >/dev/null 2>&1
+then :
+ libc_cv_mach_rpc_host_get_uptime64=yes
+else case e in #(
+ e) libc_cv_mach_rpc_host_get_uptime64=no ;;
+esac
+fi
+rm -rf conftest*
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result:
$libc_cv_mach_rpc_host_get_uptime64" >&5
+printf "%s\n" "$libc_cv_mach_rpc_host_get_uptime64" >&6; }
+if test $libc_cv_mach_rpc_host_get_uptime64 = yes; then
+ printf "%s\n" "#define HAVE_HOST_GET_UPTIME64 1" >>confdefs.h
+
+fi
+
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread_set_name in
gnumach.defs" >&5
printf %s "checking for thread_set_name in gnumach.defs... " >&6; }
if test ${libc_cv_mach_rpc_thread_set_name+y}
diff --git a/sysdeps/mach/configure.ac b/sysdeps/mach/configure.ac
index 6dfa2b3518..08e5fdefe9 100644
--- a/sysdeps/mach/configure.ac
+++ b/sysdeps/mach/configure.ac
@@ -92,6 +92,8 @@ fi
mach_RPC_CHECK(mach_host.defs, host_page_size,
HAVE_HOST_PAGE_SIZE)
+mach_RPC_CHECK(mach_host.defs, host_get_uptime64,
+ HAVE_HOST_GET_UPTIME64)
mach_RPC_CHECK(gnumach.defs, thread_set_name,
HAVE_MACH_THREAD_SET_NAME)
mach_RPC_CHECK(gnumach.defs, thread_get_name,
--
2.45.2
- [RFC PATCH glibc v3] mach: Add CLOCK_MONOTONIC case in clock_gettime(),
Zhaoming Luo <=