b9faa3301c
If std::future::wait_until is passed a time point measured against a clock that is neither std::chrono::steady_clock nor std::chrono::system_clock then the generic implementation of __atomic_futex_unsigned::_M_load_when_equal_until is called which calculates the timeout based on __clock_t and calls the _M_load_when_equal_until method for that clock to perform the actual wait. There's no guarantee that __clock_t is running at the same speed as the caller's clock, so if the underlying wait times out timeout we need to check the timeout against the caller's clock again before potentially looping. Also add two extra tests to the testsuite's async.cc: * run test03 with steady_clock_copy, which behaves identically to chrono::steady_clock, but isn't chrono::steady_clock. This causes the overload of __atomic_futex_unsigned::_M_load_when_equal_until that takes an arbitrary clock to be called. * invent test04 which uses a deliberately slow running clock in order to exercise the looping behaviour of __atomic_futex_unsigned::_M_load_when_equal_until described above. libstdc++-v3/ChangeLog: * include/bits/atomic_futex.h (__atomic_futex_unsigned::_M_load_when_equal_until): Add loop on generic _Clock to check the timeout against _Clock again after _M_load_when_equal_until returns indicating a timeout. * testsuite/30_threads/async/async.cc: Invent slow_clock that runs at an eleventh of steady_clock's speed. Use it to test the user-supplied-clock variant of __atomic_futex_unsigned::_M_load_when_equal_until works generally with test03 and loops correctly when the timeout time hasn't been reached in test04. |
||
---|---|---|
.. | ||
17_intro | ||
18_support | ||
19_diagnostics | ||
20_util | ||
21_strings | ||
22_locale | ||
23_containers | ||
24_iterators | ||
25_algorithms | ||
26_numerics | ||
27_io | ||
28_regex | ||
29_atomics | ||
30_threads | ||
abi | ||
backward | ||
config | ||
data | ||
decimal | ||
experimental | ||
ext | ||
lib | ||
libstdc++-abi | ||
libstdc++-dg | ||
libstdc++-prettyprinters | ||
libstdc++-xmethods | ||
performance | ||
special_functions | ||
std | ||
tr1 | ||
tr2 | ||
util | ||
Makefile.am | ||
Makefile.in |