diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-11-17 16:13:02 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-11-17 22:38:49 +0000 |
commit | 1e3e6c700f04fe6992b9077541e434172c1cbdae (patch) | |
tree | f5fe26e1f78055d0ccd01c0e2987d270099ffc3d /libstdc++-v3/src | |
parent | 61ef34c503443dadc0744c5150256b90d138db0a (diff) | |
download | gcc-1e3e6c700f04fe6992b9077541e434172c1cbdae.zip gcc-1e3e6c700f04fe6992b9077541e434172c1cbdae.tar.gz gcc-1e3e6c700f04fe6992b9077541e434172c1cbdae.tar.bz2 |
libstdc++: Revert changes for SYS_clock_gettime64 [PR 93421]
As discussed in the PR, it's incredibly unlikely that a system that
needs to use the SYS_clock_gettime syscall (e.g. glibc 2.16 or older) is
going to define the SYS_clock_gettime64 macro. Ancient systems that need
to use the syscall aren't going to have time64 support.
This reverts the recent changes to try and make clock_gettime syscalls
be compatible with systems that have been updated for time64 (those
changes were wrong anyway as they misspelled the SYS_clock_gettime64
macro). The changes for futex syscalls are retained, because we still
use them on modern systems that might be using time64.
To ensure that the clock_gettime syscalls are safe, configure will fail
if SYS_clock_gettime is needed, and SYS_clock_gettime64 is also defined
(but to a distinct value from SYS_clock_gettime), and the tv_sec member
of timespec is larger than long. This means we will be unable to build
on a hypothetical system where we need the time32 version of
SYS_clock_gettime but where userspace is using a time64 struct timespec.
In the unlikely event that this failure is triggered on any real
systems, we can fix it later. But we probably won't need to.
libstdc++-v3/ChangeLog:
PR libstdc++/93421
* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Fail if struct
timespec isn't compatible with SYS_clock_gettime.
* configure: Regenerate.
* src/c++11/chrono.cc: Revert changes for time64 compatibility.
Add static_assert instead.
* src/c++11/futex.cc (_M_futex_wait_until_steady): Assume
SYS_clock_gettime can use struct timespec.
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r-- | libstdc++-v3/src/c++11/chrono.cc | 17 | ||||
-rw-r--r-- | libstdc++-v3/src/c++11/futex.cc | 7 |
2 files changed, 5 insertions, 19 deletions
diff --git a/libstdc++-v3/src/c++11/chrono.cc b/libstdc++-v3/src/c++11/chrono.cc index f10be7d..723f300 100644 --- a/libstdc++-v3/src/c++11/chrono.cc +++ b/libstdc++-v3/src/c++11/chrono.cc @@ -35,17 +35,6 @@ #ifdef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL #include <unistd.h> #include <sys/syscall.h> - -# if defined(SYS_clock_gettime_time64) \ - && SYS_clock_gettime_time64 != SYS_clock_gettime - // Userspace knows about the new time64 syscalls, so it's possible that - // userspace has also updated timespec to use a 64-bit tv_sec. - // The SYS_clock_gettime syscall still uses the old definition - // of timespec where tv_sec is 32 bits, so define a type that matches that. - struct syscall_timespec { long tv_sec; long tv_nsec; }; -# else - using syscall_timespec = ::timespec; -# endif #endif namespace std _GLIBCXX_VISIBILITY(default) @@ -63,12 +52,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION system_clock::now() noexcept { #ifdef _GLIBCXX_USE_CLOCK_REALTIME + timespec tp; // -EINVAL, -EFAULT #ifdef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL - syscall_timespec tp; syscall(SYS_clock_gettime, CLOCK_REALTIME, &tp); #else - timespec tp; clock_gettime(CLOCK_REALTIME, &tp); #endif return time_point(duration(chrono::seconds(tp.tv_sec) @@ -92,12 +80,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION steady_clock::now() noexcept { #ifdef _GLIBCXX_USE_CLOCK_MONOTONIC + timespec tp; // -EINVAL, -EFAULT #ifdef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL - syscall_timespec tp; syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &tp); #else - timespec tp; clock_gettime(CLOCK_MONOTONIC, &tp); #endif return time_point(duration(chrono::seconds(tp.tv_sec) diff --git a/libstdc++-v3/src/c++11/futex.cc b/libstdc++-v3/src/c++11/futex.cc index 9adfb89..33e2097 100644 --- a/libstdc++-v3/src/c++11/futex.cc +++ b/libstdc++-v3/src/c++11/futex.cc @@ -61,8 +61,8 @@ namespace #if defined(SYS_futex_time64) && SYS_futex_time64 != SYS_futex // Userspace knows about the new time64 syscalls, so it's possible that // userspace has also updated timespec to use a 64-bit tv_sec. - // The SYS_futex and SYS_clock_gettime syscalls still use the old definition - // of timespec where tv_sec is 32 bits, so define a type that matches that. + // The SYS_futex syscall still uses the old definition of timespec + // where tv_sec is 32 bits, so define a type that matches that. struct syscall_timespec { long tv_sec; long tv_nsec; }; #else using syscall_timespec = ::timespec; @@ -234,11 +234,10 @@ namespace // We only get to here if futex_clock_monotonic_unavailable was // true or has just been set to true. + struct timespec ts; #ifdef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL - syscall_timespec ts; syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &ts); #else - struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); #endif |