libstdc++: Use correct duration for atomic_futex wait on custom clock [PR 91486]
authorMike Crowe <mac@mcrowe.com>
Mon, 5 Oct 2020 10:12:38 +0000 (11:12 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 5 Oct 2020 10:32:10 +0000 (11:32 +0100)
commitf33a43f9f7eab7482837662821abb7fd02cb4350
treeef6c5a6fe39f3d02ec61799440b7a4199ee6679c
parentd5243c46266f92f8e5373c3f314aa2abc15c9db4
libstdc++: Use correct duration for atomic_futex wait on custom clock [PR 91486]

As Jonathan Wakely pointed out[1], my change in commit
f9ddb696a289cc48d24d3d23c0b324cb88de9573 should have been rounding to
the target clock duration type rather than the input clock duration type
in __atomic_futex_unsigned::_M_load_when_equal_until just as (e.g.)
condition_variable does.

As well as fixing this, let's create a rather contrived test that fails
with the previous code, but unfortunately only when run on a machine
with an uptime of over 208.5 days, and even then not always.

[1] https://gcc.gnu.org/pipermail/libstdc++/2020-September/051004.html

libstdc++-v3/ChangeLog:

PR libstdc++/91486
* include/bits/atomic_futex.h:
(__atomic_futex_unsigned::_M_load_when_equal_until): Use target
clock duration type when rounding.
* testsuite/30_threads/async/async.cc (test_pr91486_wait_for):
Rename from test_pr91486.
(float_steady_clock): New class for test.
(test_pr91486_wait_until): New test.
libstdc++-v3/include/bits/atomic_futex.h
libstdc++-v3/testsuite/30_threads/async/async.cc