xref: /freebsd/contrib/llvm-project/libcxx/include/condition_variable (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_CONDITION_VARIABLE
110b57cec5SDimitry Andric#define _LIBCPP_CONDITION_VARIABLE
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    condition_variable synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std
170b57cec5SDimitry Andric{
180b57cec5SDimitry Andric
190b57cec5SDimitry Andricenum class cv_status { no_timeout, timeout };
200b57cec5SDimitry Andric
210b57cec5SDimitry Andricclass condition_variable
220b57cec5SDimitry Andric{
230b57cec5SDimitry Andricpublic:
240b57cec5SDimitry Andric    condition_variable();
250b57cec5SDimitry Andric    ~condition_variable();
260b57cec5SDimitry Andric
270b57cec5SDimitry Andric    condition_variable(const condition_variable&) = delete;
280b57cec5SDimitry Andric    condition_variable& operator=(const condition_variable&) = delete;
290b57cec5SDimitry Andric
300b57cec5SDimitry Andric    void notify_one() noexcept;
310b57cec5SDimitry Andric    void notify_all() noexcept;
320b57cec5SDimitry Andric
330b57cec5SDimitry Andric    void wait(unique_lock<mutex>& lock);
340b57cec5SDimitry Andric    template <class Predicate>
350b57cec5SDimitry Andric        void wait(unique_lock<mutex>& lock, Predicate pred);
360b57cec5SDimitry Andric
370b57cec5SDimitry Andric    template <class Clock, class Duration>
380b57cec5SDimitry Andric        cv_status
390b57cec5SDimitry Andric        wait_until(unique_lock<mutex>& lock,
400b57cec5SDimitry Andric                   const chrono::time_point<Clock, Duration>& abs_time);
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric    template <class Clock, class Duration, class Predicate>
430b57cec5SDimitry Andric        bool
440b57cec5SDimitry Andric        wait_until(unique_lock<mutex>& lock,
450b57cec5SDimitry Andric                   const chrono::time_point<Clock, Duration>& abs_time,
460b57cec5SDimitry Andric                   Predicate pred);
470b57cec5SDimitry Andric
480b57cec5SDimitry Andric    template <class Rep, class Period>
490b57cec5SDimitry Andric        cv_status
500b57cec5SDimitry Andric        wait_for(unique_lock<mutex>& lock,
510b57cec5SDimitry Andric                 const chrono::duration<Rep, Period>& rel_time);
520b57cec5SDimitry Andric
530b57cec5SDimitry Andric    template <class Rep, class Period, class Predicate>
540b57cec5SDimitry Andric        bool
550b57cec5SDimitry Andric        wait_for(unique_lock<mutex>& lock,
560b57cec5SDimitry Andric                 const chrono::duration<Rep, Period>& rel_time,
570b57cec5SDimitry Andric                 Predicate pred);
580b57cec5SDimitry Andric
590b57cec5SDimitry Andric    typedef pthread_cond_t* native_handle_type;
600b57cec5SDimitry Andric    native_handle_type native_handle();
610b57cec5SDimitry Andric};
620b57cec5SDimitry Andric
630b57cec5SDimitry Andricvoid notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);
640b57cec5SDimitry Andric
650b57cec5SDimitry Andricclass condition_variable_any
660b57cec5SDimitry Andric{
670b57cec5SDimitry Andricpublic:
680b57cec5SDimitry Andric    condition_variable_any();
690b57cec5SDimitry Andric    ~condition_variable_any();
700b57cec5SDimitry Andric
710b57cec5SDimitry Andric    condition_variable_any(const condition_variable_any&) = delete;
720b57cec5SDimitry Andric    condition_variable_any& operator=(const condition_variable_any&) = delete;
730b57cec5SDimitry Andric
740b57cec5SDimitry Andric    void notify_one() noexcept;
750b57cec5SDimitry Andric    void notify_all() noexcept;
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric    template <class Lock>
780b57cec5SDimitry Andric        void wait(Lock& lock);
790b57cec5SDimitry Andric    template <class Lock, class Predicate>
800b57cec5SDimitry Andric        void wait(Lock& lock, Predicate pred);
810b57cec5SDimitry Andric
820b57cec5SDimitry Andric    template <class Lock, class Clock, class Duration>
830b57cec5SDimitry Andric        cv_status
840b57cec5SDimitry Andric        wait_until(Lock& lock,
850b57cec5SDimitry Andric                   const chrono::time_point<Clock, Duration>& abs_time);
860b57cec5SDimitry Andric
870b57cec5SDimitry Andric    template <class Lock, class Clock, class Duration, class Predicate>
880b57cec5SDimitry Andric        bool
890b57cec5SDimitry Andric        wait_until(Lock& lock,
900b57cec5SDimitry Andric                   const chrono::time_point<Clock, Duration>& abs_time,
910b57cec5SDimitry Andric                   Predicate pred);
920b57cec5SDimitry Andric
930b57cec5SDimitry Andric    template <class Lock, class Rep, class Period>
940b57cec5SDimitry Andric        cv_status
950b57cec5SDimitry Andric        wait_for(Lock& lock,
960b57cec5SDimitry Andric                 const chrono::duration<Rep, Period>& rel_time);
970b57cec5SDimitry Andric
980b57cec5SDimitry Andric    template <class Lock, class Rep, class Period, class Predicate>
990b57cec5SDimitry Andric        bool
1000b57cec5SDimitry Andric        wait_for(Lock& lock,
1010b57cec5SDimitry Andric                 const chrono::duration<Rep, Period>& rel_time,
1020b57cec5SDimitry Andric                 Predicate pred);
103*5f757f3fSDimitry Andric
104*5f757f3fSDimitry Andric    // [thread.condvarany.intwait], interruptible waits
105*5f757f3fSDimitry Andric    template <class Lock, class Predicate>
106*5f757f3fSDimitry Andric      bool wait(Lock& lock, stop_token stoken, Predicate pred);                               // since C++20
107*5f757f3fSDimitry Andric
108*5f757f3fSDimitry Andric    template <class Lock, class Clock, class Duration, class Predicate>
109*5f757f3fSDimitry Andric      bool wait_until(Lock& lock, stop_token stoken,
110*5f757f3fSDimitry Andric                      const chrono::time_point<Clock, Duration>& abs_time, Predicate pred);   // since C++20
111*5f757f3fSDimitry Andric
112*5f757f3fSDimitry Andric    template <class Lock, class Rep, class Period, class Predicate>
113*5f757f3fSDimitry Andric      bool wait_for(Lock& lock, stop_token stoken,
114*5f757f3fSDimitry Andric                    const chrono::duration<Rep, Period>& rel_time, Predicate pred);           // since C++20
1150b57cec5SDimitry Andric};
1160b57cec5SDimitry Andric
1170b57cec5SDimitry Andric}  // std
1180b57cec5SDimitry Andric
1190b57cec5SDimitry Andric*/
1200b57cec5SDimitry Andric
12181ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
122*5f757f3fSDimitry Andric#include <__availability>
12306c3fb27SDimitry Andric#include <__chrono/duration.h>
12406c3fb27SDimitry Andric#include <__chrono/steady_clock.h>
12506c3fb27SDimitry Andric#include <__chrono/time_point.h>
12606c3fb27SDimitry Andric#include <__condition_variable/condition_variable.h>
1270b57cec5SDimitry Andric#include <__config>
128bdd1243dSDimitry Andric#include <__memory/shared_ptr.h>
129bdd1243dSDimitry Andric#include <__memory/unique_ptr.h>
13006c3fb27SDimitry Andric#include <__mutex/lock_guard.h>
13106c3fb27SDimitry Andric#include <__mutex/mutex.h>
13206c3fb27SDimitry Andric#include <__mutex/tag_types.h>
13306c3fb27SDimitry Andric#include <__mutex/unique_lock.h>
134*5f757f3fSDimitry Andric#include <__stop_token/stop_token.h>
13506c3fb27SDimitry Andric#include <__utility/move.h>
13604eeddc0SDimitry Andric#include <version>
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1390b57cec5SDimitry Andric#  pragma GCC system_header
1400b57cec5SDimitry Andric#endif
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric#ifndef _LIBCPP_HAS_NO_THREADS
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
1450b57cec5SDimitry Andric
14606c3fb27SDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI condition_variable_any
1470b57cec5SDimitry Andric{
1480b57cec5SDimitry Andric    condition_variable __cv_;
1490b57cec5SDimitry Andric    shared_ptr<mutex>  __mut_;
1500b57cec5SDimitry Andricpublic:
151*5f757f3fSDimitry Andric    _LIBCPP_HIDE_FROM_ABI
1520b57cec5SDimitry Andric    condition_variable_any();
1530b57cec5SDimitry Andric
154*5f757f3fSDimitry Andric    _LIBCPP_HIDE_FROM_ABI
1550b57cec5SDimitry Andric    void notify_one() _NOEXCEPT;
156*5f757f3fSDimitry Andric    _LIBCPP_HIDE_FROM_ABI
1570b57cec5SDimitry Andric    void notify_all() _NOEXCEPT;
1580b57cec5SDimitry Andric
1590b57cec5SDimitry Andric    template <class _Lock>
1600b57cec5SDimitry Andric        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
1610b57cec5SDimitry Andric        void wait(_Lock& __lock);
1620b57cec5SDimitry Andric    template <class _Lock, class _Predicate>
163*5f757f3fSDimitry Andric        _LIBCPP_HIDE_FROM_ABI
1640b57cec5SDimitry Andric        void wait(_Lock& __lock, _Predicate __pred);
1650b57cec5SDimitry Andric
1660b57cec5SDimitry Andric    template <class _Lock, class _Clock, class _Duration>
1670b57cec5SDimitry Andric        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
1680b57cec5SDimitry Andric        cv_status
1690b57cec5SDimitry Andric        wait_until(_Lock& __lock,
1700b57cec5SDimitry Andric                   const chrono::time_point<_Clock, _Duration>& __t);
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andric    template <class _Lock, class _Clock, class _Duration, class _Predicate>
1730b57cec5SDimitry Andric        bool
174*5f757f3fSDimitry Andric        _LIBCPP_HIDE_FROM_ABI
1750b57cec5SDimitry Andric        wait_until(_Lock& __lock,
1760b57cec5SDimitry Andric                   const chrono::time_point<_Clock, _Duration>& __t,
1770b57cec5SDimitry Andric                   _Predicate __pred);
1780b57cec5SDimitry Andric
1790b57cec5SDimitry Andric    template <class _Lock, class _Rep, class _Period>
1800b57cec5SDimitry Andric        cv_status
181*5f757f3fSDimitry Andric        _LIBCPP_HIDE_FROM_ABI
1820b57cec5SDimitry Andric        wait_for(_Lock& __lock,
1830b57cec5SDimitry Andric                 const chrono::duration<_Rep, _Period>& __d);
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andric    template <class _Lock, class _Rep, class _Period, class _Predicate>
1860b57cec5SDimitry Andric        bool
187*5f757f3fSDimitry Andric        _LIBCPP_HIDE_FROM_ABI
1880b57cec5SDimitry Andric        wait_for(_Lock& __lock,
1890b57cec5SDimitry Andric                 const chrono::duration<_Rep, _Period>& __d,
1900b57cec5SDimitry Andric                 _Predicate __pred);
191*5f757f3fSDimitry Andric
192*5f757f3fSDimitry Andric#if _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_STOP_TOKEN)
193*5f757f3fSDimitry Andric
194*5f757f3fSDimitry Andric    template <class _Lock, class _Predicate>
195*5f757f3fSDimitry Andric    _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool wait(_Lock& __lock, stop_token __stoken, _Predicate __pred);
196*5f757f3fSDimitry Andric
197*5f757f3fSDimitry Andric    template <class _Lock, class _Clock, class _Duration, class _Predicate>
198*5f757f3fSDimitry Andric    _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool wait_until(_Lock& __lock, stop_token __stoken,
199*5f757f3fSDimitry Andric                const chrono::time_point<_Clock, _Duration>& __abs_time, _Predicate __pred);
200*5f757f3fSDimitry Andric
201*5f757f3fSDimitry Andric    template <class _Lock, class _Rep, class _Period, class _Predicate>
202*5f757f3fSDimitry Andric    _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI bool wait_for(_Lock& __lock, stop_token __stoken,
203*5f757f3fSDimitry Andric                const chrono::duration<_Rep, _Period>& __rel_time, _Predicate __pred);
204*5f757f3fSDimitry Andric
205*5f757f3fSDimitry Andric#endif // _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_STOP_TOKEN)
2060b57cec5SDimitry Andric};
2070b57cec5SDimitry Andric
2080b57cec5SDimitry Andricinline
2090b57cec5SDimitry Andriccondition_variable_any::condition_variable_any()
2100b57cec5SDimitry Andric    : __mut_(make_shared<mutex>()) {}
2110b57cec5SDimitry Andric
2120b57cec5SDimitry Andricinline
2130b57cec5SDimitry Andricvoid
2140b57cec5SDimitry Andriccondition_variable_any::notify_one() _NOEXCEPT
2150b57cec5SDimitry Andric{
2160b57cec5SDimitry Andric    {lock_guard<mutex> __lx(*__mut_);}
2170b57cec5SDimitry Andric    __cv_.notify_one();
2180b57cec5SDimitry Andric}
2190b57cec5SDimitry Andric
2200b57cec5SDimitry Andricinline
2210b57cec5SDimitry Andricvoid
2220b57cec5SDimitry Andriccondition_variable_any::notify_all() _NOEXCEPT
2230b57cec5SDimitry Andric{
2240b57cec5SDimitry Andric    {lock_guard<mutex> __lx(*__mut_);}
2250b57cec5SDimitry Andric    __cv_.notify_all();
2260b57cec5SDimitry Andric}
2270b57cec5SDimitry Andric
2280b57cec5SDimitry Andricstruct __lock_external
2290b57cec5SDimitry Andric{
2300b57cec5SDimitry Andric    template <class _Lock>
23106c3fb27SDimitry Andric    _LIBCPP_HIDE_FROM_ABI void operator()(_Lock* __m) {__m->lock();}
2320b57cec5SDimitry Andric};
2330b57cec5SDimitry Andric
2340b57cec5SDimitry Andrictemplate <class _Lock>
2350b57cec5SDimitry Andricvoid
2360b57cec5SDimitry Andriccondition_variable_any::wait(_Lock& __lock)
2370b57cec5SDimitry Andric{
2380b57cec5SDimitry Andric    shared_ptr<mutex> __mut = __mut_;
2390b57cec5SDimitry Andric    unique_lock<mutex> __lk(*__mut);
2400b57cec5SDimitry Andric    __lock.unlock();
2410b57cec5SDimitry Andric    unique_ptr<_Lock, __lock_external> __lxx(&__lock);
24206c3fb27SDimitry Andric    lock_guard<unique_lock<mutex> > __lx(__lk, adopt_lock_t());
2430b57cec5SDimitry Andric    __cv_.wait(__lk);
2440b57cec5SDimitry Andric}  // __mut_.unlock(), __lock.lock()
2450b57cec5SDimitry Andric
2460b57cec5SDimitry Andrictemplate <class _Lock, class _Predicate>
2470b57cec5SDimitry Andricinline
2480b57cec5SDimitry Andricvoid
2490b57cec5SDimitry Andriccondition_variable_any::wait(_Lock& __lock, _Predicate __pred)
2500b57cec5SDimitry Andric{
2510b57cec5SDimitry Andric    while (!__pred())
2520b57cec5SDimitry Andric        wait(__lock);
2530b57cec5SDimitry Andric}
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andrictemplate <class _Lock, class _Clock, class _Duration>
2560b57cec5SDimitry Andriccv_status
2570b57cec5SDimitry Andriccondition_variable_any::wait_until(_Lock& __lock,
2580b57cec5SDimitry Andric                                   const chrono::time_point<_Clock, _Duration>& __t)
2590b57cec5SDimitry Andric{
2600b57cec5SDimitry Andric    shared_ptr<mutex> __mut = __mut_;
2610b57cec5SDimitry Andric    unique_lock<mutex> __lk(*__mut);
2620b57cec5SDimitry Andric    __lock.unlock();
2630b57cec5SDimitry Andric    unique_ptr<_Lock, __lock_external> __lxx(&__lock);
26406c3fb27SDimitry Andric    lock_guard<unique_lock<mutex> > __lx(__lk, adopt_lock_t());
2650b57cec5SDimitry Andric    return __cv_.wait_until(__lk, __t);
2660b57cec5SDimitry Andric}  // __mut_.unlock(), __lock.lock()
2670b57cec5SDimitry Andric
2680b57cec5SDimitry Andrictemplate <class _Lock, class _Clock, class _Duration, class _Predicate>
2690b57cec5SDimitry Andricinline
2700b57cec5SDimitry Andricbool
2710b57cec5SDimitry Andriccondition_variable_any::wait_until(_Lock& __lock,
2720b57cec5SDimitry Andric                                   const chrono::time_point<_Clock, _Duration>& __t,
2730b57cec5SDimitry Andric                                   _Predicate __pred)
2740b57cec5SDimitry Andric{
2750b57cec5SDimitry Andric    while (!__pred())
2760b57cec5SDimitry Andric        if (wait_until(__lock, __t) == cv_status::timeout)
2770b57cec5SDimitry Andric            return __pred();
2780b57cec5SDimitry Andric    return true;
2790b57cec5SDimitry Andric}
2800b57cec5SDimitry Andric
2810b57cec5SDimitry Andrictemplate <class _Lock, class _Rep, class _Period>
2820b57cec5SDimitry Andricinline
2830b57cec5SDimitry Andriccv_status
2840b57cec5SDimitry Andriccondition_variable_any::wait_for(_Lock& __lock,
2850b57cec5SDimitry Andric                                 const chrono::duration<_Rep, _Period>& __d)
2860b57cec5SDimitry Andric{
2870b57cec5SDimitry Andric    return wait_until(__lock, chrono::steady_clock::now() + __d);
2880b57cec5SDimitry Andric}
2890b57cec5SDimitry Andric
2900b57cec5SDimitry Andrictemplate <class _Lock, class _Rep, class _Period, class _Predicate>
2910b57cec5SDimitry Andricinline
2920b57cec5SDimitry Andricbool
2930b57cec5SDimitry Andriccondition_variable_any::wait_for(_Lock& __lock,
2940b57cec5SDimitry Andric                                 const chrono::duration<_Rep, _Period>& __d,
2950b57cec5SDimitry Andric                                 _Predicate __pred)
2960b57cec5SDimitry Andric{
2970b57cec5SDimitry Andric    return wait_until(__lock, chrono::steady_clock::now() + __d,
298*5f757f3fSDimitry Andric                      std::move(__pred));
2990b57cec5SDimitry Andric}
3000b57cec5SDimitry Andric
301*5f757f3fSDimitry Andric#if _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_STOP_TOKEN)
302*5f757f3fSDimitry Andric
303*5f757f3fSDimitry Andrictemplate <class _Lock, class _Predicate>
304*5f757f3fSDimitry Andricbool condition_variable_any::wait(_Lock& __lock, stop_token __stoken, _Predicate __pred) {
305*5f757f3fSDimitry Andric    while (!__stoken.stop_requested()) {
306*5f757f3fSDimitry Andric        if (__pred())
307*5f757f3fSDimitry Andric            return true;
308*5f757f3fSDimitry Andric        wait(__lock);
309*5f757f3fSDimitry Andric    }
310*5f757f3fSDimitry Andric    return __pred();
311*5f757f3fSDimitry Andric}
312*5f757f3fSDimitry Andric
313*5f757f3fSDimitry Andrictemplate <class _Lock, class _Clock, class _Duration, class _Predicate>
314*5f757f3fSDimitry Andricbool condition_variable_any::wait_until(
315*5f757f3fSDimitry Andric    _Lock& __lock, stop_token __stoken, const chrono::time_point<_Clock, _Duration>& __abs_time, _Predicate __pred) {
316*5f757f3fSDimitry Andric    while (!__stoken.stop_requested()) {
317*5f757f3fSDimitry Andric        if (__pred())
318*5f757f3fSDimitry Andric            return true;
319*5f757f3fSDimitry Andric        if (wait_until(__lock, __abs_time) == cv_status::timeout)
320*5f757f3fSDimitry Andric            return __pred();
321*5f757f3fSDimitry Andric    }
322*5f757f3fSDimitry Andric    return __pred();
323*5f757f3fSDimitry Andric}
324*5f757f3fSDimitry Andric
325*5f757f3fSDimitry Andrictemplate <class _Lock, class _Rep, class _Period, class _Predicate>
326*5f757f3fSDimitry Andricbool condition_variable_any::wait_for(
327*5f757f3fSDimitry Andric    _Lock& __lock, stop_token __stoken, const chrono::duration<_Rep, _Period>& __rel_time, _Predicate __pred) {
328*5f757f3fSDimitry Andric    return wait_until(__lock, std::move(__stoken), chrono::steady_clock::now() + __rel_time, std::move(__pred));
329*5f757f3fSDimitry Andric}
330*5f757f3fSDimitry Andric
331*5f757f3fSDimitry Andric#endif // _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_STOP_TOKEN)
332*5f757f3fSDimitry Andric
33306c3fb27SDimitry Andric_LIBCPP_EXPORTED_FROM_ABI void notify_all_at_thread_exit(condition_variable&, unique_lock<mutex>);
3340b57cec5SDimitry Andric
3350b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
3360b57cec5SDimitry Andric
3370b57cec5SDimitry Andric#endif // !_LIBCPP_HAS_NO_THREADS
3380b57cec5SDimitry Andric
339bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
34006c3fb27SDimitry Andric#  include <atomic>
341bdd1243dSDimitry Andric#  include <concepts>
34206c3fb27SDimitry Andric#  include <cstdint>
34306c3fb27SDimitry Andric#  include <cstdlib>
34406c3fb27SDimitry Andric#  include <cstring>
34506c3fb27SDimitry Andric#  include <initializer_list>
346*5f757f3fSDimitry Andric#  include <iosfwd>
34706c3fb27SDimitry Andric#  include <new>
34806c3fb27SDimitry Andric#  include <stdexcept>
34906c3fb27SDimitry Andric#  include <system_error>
350bdd1243dSDimitry Andric#  include <type_traits>
35106c3fb27SDimitry Andric#  include <typeinfo>
352bdd1243dSDimitry Andric#endif
353bdd1243dSDimitry Andric
3540b57cec5SDimitry Andric#endif // _LIBCPP_CONDITION_VARIABLE
355