diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-11-25 10:26:09 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-11-25 10:31:55 +0000 |
commit | ad9cbcee543ecccd79fa49dafcd925532d2ce210 (patch) | |
tree | 5d83551cb2e35ebc9f478391c791ca686c8b7ead | |
parent | a7285c8659689e9ade53fcb996b26d874455a4f3 (diff) | |
download | gcc-ad9cbcee543ecccd79fa49dafcd925532d2ce210.zip gcc-ad9cbcee543ecccd79fa49dafcd925532d2ce210.tar.gz gcc-ad9cbcee543ecccd79fa49dafcd925532d2ce210.tar.bz2 |
libstdc++: Fix handling of futex wake [PR 97936]
The __platform_wait function is supposed to wait until *addr != old.
The futex syscall checks the initial value and returns EAGAIN if *addr
!= old is already true, which should cause __platform_wait to return.
Instead it loops and keeps doing a futex wait, which keeps returning
EAGAIN.
libstdc++-v3/ChangeLog:
PR libstdc++/97936
* include/bits/atomic_wait.h (__platform_wait): Return if futex
sets EAGAIN.
* testsuite/30_threads/latch/3.cc: Re-enable test.
* testsuite/30_threads/semaphore/try_acquire_until.cc: Likewise.
-rw-r--r-- | libstdc++-v3/include/bits/atomic_wait.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/30_threads/latch/3.cc | 1 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_until.cc | 1 |
3 files changed, 2 insertions, 4 deletions
diff --git a/libstdc++-v3/include/bits/atomic_wait.h b/libstdc++-v3/include/bits/atomic_wait.h index cd756f6..fdf7c45 100644 --- a/libstdc++-v3/include/bits/atomic_wait.h +++ b/libstdc++-v3/include/bits/atomic_wait.h @@ -100,9 +100,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION auto __e = syscall (SYS_futex, static_cast<const void*>(__addr), static_cast<int>(__futex_wait_flags::__wait_private), __val, nullptr); - if (!__e) + if (!__e || EAGAIN) break; - else if (!(errno == EINTR || errno == EAGAIN)) + else if (errno != EINTR) __throw_system_error(__e); } } diff --git a/libstdc++-v3/testsuite/30_threads/latch/3.cc b/libstdc++-v3/testsuite/30_threads/latch/3.cc index 6304135..70f2d18 100644 --- a/libstdc++-v3/testsuite/30_threads/latch/3.cc +++ b/libstdc++-v3/testsuite/30_threads/latch/3.cc @@ -19,7 +19,6 @@ // { dg-do run { target c++2a } } // { dg-require-gthreads "" } // { dg-additional-options "-pthread" { target pthread } } -// { dg-skip-if "broken" { *-*-* } } #include <latch> #include <atomic> diff --git a/libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_until.cc b/libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_until.cc index 5e11414..58f68ce 100644 --- a/libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_until.cc +++ b/libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_until.cc @@ -19,7 +19,6 @@ // { dg-do run { target c++2a } } // { dg-require-gthreads "" } // { dg-additional-options "-pthread" { target pthread } } -// { dg-skip-if "broken" { *-*-* } } #include <semaphore> #include <chrono> |