[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC PATCH glibc v3] mach: Add CLOCK_MONOTONIC case in clock_gettime
From: |
Samuel Thibault |
Subject: |
Re: [RFC PATCH glibc v3] mach: Add CLOCK_MONOTONIC case in clock_gettime() |
Date: |
Sun, 12 Jan 2025 23:34:19 +0100 |
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)