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  <m...@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
-- 
git-series 0.9.1

Reply via email to