https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41861

--- Comment #19 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Author: redi
Date: Wed Sep  4 22:43:29 2019
New Revision: 275390

URL: https://gcc.gnu.org/viewcvs?rev=275390&root=gcc&view=rev
Log:
PR libstdc++/41861 Add full steady_clock support to condition_variable

The pthread_cond_clockwait function is available in glibc since the 2.30
release. If this function is available in the C library it can be used
to fix PR libstdc++/41861 by supporting std::chrono::steady_clock
properly with std::condition_variable.

This means that code using std::condition_variable::wait_for or
std::condition_variable::wait_until with std::chrono::steady_clock is no
longer subject to timing out early or potentially waiting for much
longer if the system clock is warped at an inopportune moment.

If pthread_cond_clockwait is available then std::chrono::steady_clock is
deemed to be the "best" clock available which means that it is used for
the relative wait_for calls and absolute wait_until calls using
user-defined clocks. Calls explicitly using std::chrono::system_clock
continue to use CLOCK_REALTIME via __gthread_cond_timedwait.

If pthread_cond_clockwait is not available then
std::chrono::system_clock is deemed to be the "best" clock available
which means that the previous suboptimal behaviour remains.

2019-09-04  Mike Crowe  <m...@mcrowe.com>

        PR libstdc++/41861
        * acinclude.m4 (GLIBCXX_CHECK_PTHREAD_COND_CLOCKWAIT): Check for new
        pthread_cond_clockwait function.
        * configure.ac: Use GLIBCXX_CHECK_PTHREAD_COND_CLOCKWAIT.
        * configure: Regenerate.
        * config.h.in: Regenerate.
        * include/std/condition_variable: (condition_variable): Rename
        __steady_clock_t typedef and add system_clock. Change __clock_t to be
        a typedef for the preferred clock to convert arbitrary other clocks to.
        [_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT] (wait_until): Add a steady_clock
        overload.
        (wait_until): Change __clock_t overload to use system_clock.
        [_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT] (__wait_until_impl): Add
        steady_clock overload that calls pthread_cond_clockwait.
        (__wait_until_impl): Change __clock_t overload to use system_clock.
        (condition_variable_any) [_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT]: Use
        steady_clock for __clock_t if pthread_cond_clockwait is available.

Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/acinclude.m4
    trunk/libstdc++-v3/config.h.in
    trunk/libstdc++-v3/configure
    trunk/libstdc++-v3/configure.ac
    trunk/libstdc++-v3/include/std/condition_variable

Reply via email to