diff --git a/libcxx/include/__config b/libcxx/include/__config --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -1160,10 +1160,10 @@ #if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) #if defined(__ANDROID__) && __ANDROID_API__ >= 30 -#define _LIBCPP_HAS_COND_CLOCKWAIT +#define _LIBCPP_HAS_COND_STEADY_TIMEDWAIT #elif defined(_LIBCPP_GLIBC_PREREQ) #if _LIBCPP_GLIBC_PREREQ(2, 30) -#define _LIBCPP_HAS_COND_CLOCKWAIT +#define _LIBCPP_HAS_COND_STEADY_TIMEDWAIT #endif #endif #endif diff --git a/libcxx/include/__mutex_base b/libcxx/include/__mutex_base --- a/libcxx/include/__mutex_base +++ b/libcxx/include/__mutex_base @@ -323,7 +323,7 @@ private: void __do_timed_wait(unique_lock& __lk, chrono::time_point) _NOEXCEPT; -#if defined(_LIBCPP_HAS_COND_CLOCKWAIT) +#if defined(_LIBCPP_HAS_COND_STEADY_TIMEDWAIT) void __do_timed_wait(unique_lock& __lk, chrono::time_point) _NOEXCEPT; #endif @@ -446,7 +446,7 @@ using __ns_rep = nanoseconds::rep; steady_clock::time_point __c_now = steady_clock::now(); -#if defined(_LIBCPP_HAS_COND_CLOCKWAIT) +#if defined(_LIBCPP_HAS_COND_STEADY_TIMEDWAIT) using __clock_tp_ns = time_point; __ns_rep __now_count_ns = _VSTD::__safe_nanosecond_cast(__c_now.time_since_epoch()).count(); #else @@ -477,7 +477,7 @@ _VSTD::move(__pred)); } -#if defined(_LIBCPP_HAS_COND_CLOCKWAIT) +#if defined(_LIBCPP_HAS_COND_STEADY_TIMEDWAIT) inline void condition_variable::__do_timed_wait(unique_lock& __lk, @@ -488,7 +488,7 @@ __throw_system_error(EPERM, "condition_variable::timed wait: mutex not locked"); nanoseconds __d = __tp.time_since_epoch(); - timespec __ts; + __libcpp_timespec_t __ts; seconds __s = duration_cast(__d); using __ts_sec = decltype(__ts.tv_sec); const __ts_sec __ts_sec_max = numeric_limits<__ts_sec>::max(); @@ -502,11 +502,13 @@ __ts.tv_sec = __ts_sec_max; __ts.tv_nsec = giga::num - 1; } - int __ec = pthread_cond_clockwait(&__cv_, __lk.mutex()->native_handle(), CLOCK_MONOTONIC, &__ts); + int __ec = __libcpp_condvar_steady_timedwait(&__cv_, + __lk.mutex()->native_handle(), + &__ts); if (__ec != 0 && __ec != ETIMEDOUT) __throw_system_error(__ec, "condition_variable timed_wait failed"); } -#endif // _LIBCPP_HAS_COND_CLOCKWAIT +#endif // _LIBCPP_HAS_COND_STEADY_TIMEDWAIT template inline diff --git a/libcxx/include/__threading_support b/libcxx/include/__threading_support --- a/libcxx/include/__threading_support +++ b/libcxx/include/__threading_support @@ -195,6 +195,13 @@ int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m, __libcpp_timespec_t *__ts); +#ifdef _LIBCPP_HAS_COND_STEADY_TIMEDWAIT +_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS +int __libcpp_condvar_steady_timedwait(__libcpp_condvar_t *__cv, + __libcpp_mutex_t *__m, + __libcpp_timespec_t *__ts); +#endif + _LIBCPP_THREAD_ABI_VISIBILITY int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv); @@ -353,6 +360,16 @@ return pthread_cond_timedwait(__cv, __m, __ts); } +#ifdef _LIBCPP_HAS_COND_STEADY_TIMEDWAIT +_LIBCPP_HIDE_FROM_ABI inline +int __libcpp_condvar_steady_timedwait(__libcpp_condvar_t *__cv, + __libcpp_mutex_t *__m, + __libcpp_timespec_t *__ts) +{ + return pthread_cond_clockwait(__cv, __m, CLOCK_MONOTONIC, __ts); +} +#endif + _LIBCPP_HIDE_FROM_ABI inline int __libcpp_condvar_destroy(__libcpp_condvar_t *__cv) { @@ -534,7 +551,7 @@ _LIBCPP_HIDE_FROM_ABI inline int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m, - timespec *__ts) + __libcpp_timespec_t *__ts) { int __ec = cnd_timedwait(__cv, __m, __ts); return __ec == thrd_timedout ? ETIMEDOUT : __ec;