mbox series

[v4,0/7] std::future::wait_* improvements

Message ID cover.0bb53709a913f3c9a8c2f9da476440e72c8be6d2.1572191159.git-series.mac@mcrowe.com
Headers show
Series std::future::wait_* improvements | expand

Message

Mike Crowe Oct. 27, 2019, 3:46 p.m. UTC
v1 of this series was originally posted back in September 2017 (see
https://gcc.gnu.org/ml/libstdc++/2017-09/msg00083.html )

v2 of this series was originally posted back in January 2018 (see
https://gcc.gnu.org/ml/libstdc++/2018-01/msg00035.html )

v3 of this series was originally posted back in August 2018 (see
https://gcc.gnu.org/ml/libstdc++/2018-08/msg00001.html )

Changes since v3:

* Update libstdc++-v3/config/abi/pre/gnu.ver as recommended by
  Jonathan Wakely in
  https://gcc.gnu.org/ml/libstdc++/2018-08/msg00015.html .

* Replace _GLIBCXX_DEBUG_ASSERT with __glibcxx_assert in futex.cc as
  recommended by Jonathan Wakely in
  https://gcc.gnu.org/ml/libstdc++/2018-08/msg00014.html .

* Incorporate extra patch originally posted separately in
  https://gcc.gnu.org/ml/libstdc++/2018-08/msg00017.html .

* Rename incorrect futex_clock_realtime_unavailable to
  futex_clock_monotonic_unavailable in comment.	 Spotted by Jonathan
  Wakely.

* Improve commit messages to use GNU two-spaces-after-periods style
  and add changelogs.

* Restrict lines to eighty columns or less.

* Remove unnecessarily-added steady_clock_copy from test - slow_clock
  works just as well.

* A few other minor tweaks to tests and comments.

Combined ChangeLog entry (generated from the separate messages in each
commit):

2019-10-27  Mike Crowe	<mac@mcrowe.com>

	* libstdc++-v3/testsuite/30_threads/async/async.cc (test02):
	Test steady_clock with std::future::wait_until.	 (test03): Add
	new test templated on clock type waiting for future associated
	with async to resolve.	(main): Call test03 to test both
	system_clock and steady_clock.

	* libstdc++-v3/src/c++11/futex.cc: Add new constants for
	required futex flags.  Add futex_clock_realtime_unavailable
	flag to store result of trying to use FUTEX_CLOCK_REALTIME.
	(__atomic_futex_unsigned_base::_M_futex_wait_until): Try to
	use FUTEX_WAIT_BITSET with FUTEX_CLOCK_REALTIME and only fall
	back to using gettimeofday and FUTEX_WAIT if that's not
	supported.

	* libstdc++-v3/config/abi/pre/gnu.ver: Update for addition of
	__atomic_futex_unsigned_base::_M_futex_wait_until_steady.
	* libstdc++-v3/include/bits/atomic_futex.h
	(__atomic_futex_unsigned_base): Add comments to clarify that
	_M_futex_wait_until _M_load_and_test_until use CLOCK_REALTIME.
	Declare new _M_futex_wait_until_steady and
	_M_load_and_text_until_steady methods that use
	CLOCK_MONOTONIC.  Add _M_load_and_test_until_impl and
	_M_load_when_equal_until overloads that accept a steady_clock
	time_point and use these new methods.
	* libstdc++-v3/src/c++11/futex.cc: Include headers required
	for clock_gettime. Add futex_clock_monotonic_flag constant to
	tell futex to use CLOCK_MONOTONIC to match the existing
	futex_clock_realtime_flag.  Add
	futex_clock_monotonic_unavailable to store the result of
	trying to use CLOCK_MONOTONIC.
	(__atomic_futex_unsigned_base::_M_futex_wait_until_steady):
	Add new variant of _M_futex_wait_until that uses
	CLOCK_MONOTONIC to support waiting using steady_clock.

	* libstdc++-v3/include/bits/atomic_futex.h:
	(__atomic_futex_unsigned): Change __clock_t typedef to use
	steady_clock so that unknown clocks are synced to it rather
	than system_clock. Change existing __clock_t overloads of
	_M_load_and_text_until_impl and _M_load_when_equal_until to
	use system_clock explicitly. Remove comment about DR 887 since
	these changes address that problem as best as we currently
	able.

	* libstdc++-v3/include/bits/atomic_futex.h:
	(__atomic_futex_unsigned) Add loop to _M_load_when_equal_until
	on generic _Clock to check the timeout against _Clock again
	after _M_load_when_equal_until returns indicating a timeout.
	* libstdc++-v3/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.

	* libstdc++-v3/include/bits/atomic_futex.h:
	(__atomic_futex_unsigned::_M_load_when_equal_for): Round up
	timeout if required after conversion to reference clock
	duration.
	* libstdc++-v3/testsuite/30_threads/async/async.cc:
	(test_pr68519): New test for the equivalent of PR
	libstdc++/68519.

Mike Crowe (7):
  libstdc++: Improve async test
  libstdc++ futex: Use FUTEX_CLOCK_REALTIME for wait
  libstdc++ futex: Support waiting on std::chrono::steady_clock directly
  libstdc++ atomic_futex: Use std::chrono::steady_clock as reference clock
  libstdc++ futex: Loop when waiting against arbitrary clock
  libstdc++ atomic_futex: Avoid rounding errors in std::future::wait_for
  libstdc++: Extra async tests, not for merging

 libstdc++-v3/config/abi/pre/gnu.ver              |  10 +-
 libstdc++-v3/include/bits/atomic_futex.h         |  95 +++++++--
 libstdc++-v3/src/c++11/futex.cc                  | 119 +++++++++++-
 libstdc++-v3/testsuite/30_threads/async/async.cc | 170 ++++++++++++++++-
 4 files changed, 379 insertions(+), 15 deletions(-)

base-commit: 541ec0fe27585fce2b27750ca2bb1cf8985b043e