On Sun, Jan 12, 2025 at 11:34:19PM +0100, Samuel Thibault wrote: > Hello, > > Zhaoming Luo, le lun. 06 janv. 2025 12:39:07 +0800, a ecrit: > > 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); > > I changed this a bit to fallback to CLOCK_REALTIME in that case too. No > real reason to have a different behavior depending only on the installed > mach_host.defs file :)
OK. Thanks for the submit. Zhaoming > > Thanks! > > > > + } > > + 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 > > > > > > -- > Samuel > +#if defined(__alpha__) && defined(CONFIG_PCI) > + /* > + * The meaning of life, the universe, and everything. Plus > + * this makes the year come out right. > + */ > + year -= 42; > +#endif > (From the patch for 1.3.2: (kernel/time.c), submitted by Marcus Meissner)