diff options
author | Zhaoming Luo <zhmingluo@163.com> | 2025-03-24 13:20:42 +0800 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-03-25 01:10:10 +0100 |
commit | 0544df4f4a9c6ce72de589e95f5bdadce8f103d0 (patch) | |
tree | ce58990a579a67e806332de10ab94068f6b8f1d0 /sysdeps | |
parent | b62692d3c77617747263a4cff5ea3db1ab731df0 (diff) | |
download | glibc-0544df4f4a9c6ce72de589e95f5bdadce8f103d0.zip glibc-0544df4f4a9c6ce72de589e95f5bdadce8f103d0.tar.gz glibc-0544df4f4a9c6ce72de589e95f5bdadce8f103d0.tar.bz2 |
mach: Use the host_get_time64 to replace the deprecated host_get_time for CLOCK_REALTIME when it's available
Check the availability of host_get_time64 and use it to replace
host_get_time for CLOCK_REALTIME when it's available. Fall back to
host_get_time if gnumach does not support host_get_time64 but the
gnumach headers do.
host_get_time is deprecated
See https://git.savannah.gnu.org/cgit/hurd/gnumach.git/commit/?id=569df850cd7badd1e36132ad3b44aa76a4d27c25
However, it's kept for backward compactbility.
* config.h.in: Add HAVE_HOST_GET_TIME64 config entry.
* sysdeps/mach/clock_gettime.c: Use host_get_time64 for CLOCK_REALTIME
when it's possible, fall to host_get_time otherwise.
* sysdeps/mach/configure: Check the existence of host_get_time64 RPC.
* sysdeps/mach/configure.ac: Check the existence of host_get_time64 RPC.
Message-ID: <20250324052042.19803-1-zhmingluo@163.com>
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/mach/clock_gettime.c | 20 | ||||
-rw-r--r-- | sysdeps/mach/configure | 30 | ||||
-rw-r--r-- | sysdeps/mach/configure.ac | 2 |
3 files changed, 52 insertions, 0 deletions
diff --git a/sysdeps/mach/clock_gettime.c b/sysdeps/mach/clock_gettime.c index 381ccb8..8d0143c 100644 --- a/sysdeps/mach/clock_gettime.c +++ b/sysdeps/mach/clock_gettime.c @@ -57,6 +57,26 @@ __clock_gettime (clockid_t clock_id, struct timespec *ts) case CLOCK_REALTIME: { +#ifdef HAVE_HOST_GET_TIME64 + time_value64_t tv_64; + err = __host_get_time64 (__mach_host_self (), &tv_64); + + /* If err is MIG_BAD_ID, it means an old gnumach which does not + support __host_get_time64 is running against the new gnumach + headers which has the signature of __host_get_time64. In that + case, we fall back to __host_get_time. */ + if (err != MIG_BAD_ID) + { + if (err) + { + __set_errno (err); + return -1; + } + + TIME_VALUE64_TO_TIMESPEC (&tv_64, ts); + return 0; + } +#endif /* __host_get_time can only fail if passed an invalid host_t. __mach_host_self could theoretically fail (producing an invalid host_t) due to resource exhaustion, but we assume diff --git a/sysdeps/mach/configure b/sysdeps/mach/configure index 8aa6bbb..311b2dd 100644 --- a/sysdeps/mach/configure +++ b/sysdeps/mach/configure @@ -491,6 +491,36 @@ if test $libc_cv_mach_rpc_host_get_uptime64 = yes; then fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for host_get_time64 in mach_host.defs" >&5 +printf %s "checking for host_get_time64 in mach_host.defs... " >&6; } +if test ${libc_cv_mach_rpc_host_get_time64+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_time64" >/dev/null 2>&1 +then : + libc_cv_mach_rpc_host_get_time64=yes +else case e in #( + e) libc_cv_mach_rpc_host_get_time64=no ;; +esac +fi +rm -rf conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mach_rpc_host_get_time64" >&5 +printf "%s\n" "$libc_cv_mach_rpc_host_get_time64" >&6; } +if test $libc_cv_mach_rpc_host_get_time64 = yes; then + printf "%s\n" "#define HAVE_HOST_GET_TIME64 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 08e5fde..3a6f244 100644 --- a/sysdeps/mach/configure.ac +++ b/sysdeps/mach/configure.ac @@ -94,6 +94,8 @@ 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(mach_host.defs, host_get_time64, + HAVE_HOST_GET_TIME64) mach_RPC_CHECK(gnumach.defs, thread_set_name, HAVE_MACH_THREAD_SET_NAME) mach_RPC_CHECK(gnumach.defs, thread_get_name, |