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)


Reply via email to