libstdc++: Fix handling of futex wake [PR 97936]
authorJonathan Wakely <jwakely@redhat.com>
Wed, 25 Nov 2020 10:26:09 +0000 (10:26 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 25 Nov 2020 10:31:55 +0000 (10:31 +0000)
commitad9cbcee543ecccd79fa49dafcd925532d2ce210
tree5d83551cb2e35ebc9f478391c791ca686c8b7ead
parenta7285c8659689e9ade53fcb996b26d874455a4f3
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.
libstdc++-v3/include/bits/atomic_wait.h
libstdc++-v3/testsuite/30_threads/latch/3.cc
libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_until.cc