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