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 :) Thanks! Samuel > + } > + 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)