condition_variable.cpp revision 227983
1195618Srpaulo//===-------------------- condition_variable.cpp --------------------------===//
2195618Srpaulo//
3195618Srpaulo//                     The LLVM Compiler Infrastructure
4195618Srpaulo//
5195618Srpaulo// This file is dual licensed under the MIT and the University of Illinois Open
6195618Srpaulo// Source Licenses. See LICENSE.TXT for details.
7195618Srpaulo//
8195618Srpaulo//===----------------------------------------------------------------------===//
9195618Srpaulo
10195618Srpaulo#include "condition_variable"
11195618Srpaulo#include "thread"
12195618Srpaulo#include "system_error"
13195618Srpaulo#include "cassert"
14195618Srpaulo
15195618Srpaulo_LIBCPP_BEGIN_NAMESPACE_STD
16195618Srpaulo
17195618Srpaulocondition_variable::~condition_variable()
18195618Srpaulo{
19195618Srpaulo    int e = pthread_cond_destroy(&__cv_);
20195618Srpaulo//     assert(e == 0);
21195618Srpaulo}
22195618Srpaulo
23195618Srpaulovoid
24195618Srpaulocondition_variable::notify_one()
25195618Srpaulo{
26195618Srpaulo    pthread_cond_signal(&__cv_);
27195618Srpaulo}
28195618Srpaulo
29195618Srpaulovoid
30195618Srpaulocondition_variable::notify_all()
31195618Srpaulo{
32195618Srpaulo    pthread_cond_broadcast(&__cv_);
33195618Srpaulo}
34195618Srpaulo
35195618Srpaulovoid
36230408Sadriancondition_variable::wait(unique_lock<mutex>& lk)
37195618Srpaulo{
38195618Srpaulo    if (!lk.owns_lock())
39195618Srpaulo        __throw_system_error(EPERM,
40195618Srpaulo                                  "condition_variable::wait: mutex not locked");
41195618Srpaulo    int ec = pthread_cond_wait(&__cv_, lk.mutex()->native_handle());
42195618Srpaulo    if (ec)
43230408Sadrian        __throw_system_error(ec, "condition_variable wait failed");
44230408Sadrian}
45195618Srpaulo
46195618Srpaulovoid
47195618Srpaulocondition_variable::__do_timed_wait(unique_lock<mutex>& lk,
48195618Srpaulo               chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp)
49195618Srpaulo{
50195618Srpaulo    using namespace chrono;
51195618Srpaulo    if (!lk.owns_lock())
52195618Srpaulo        __throw_system_error(EPERM,
53195618Srpaulo                            "condition_variable::timed wait: mutex not locked");
54195618Srpaulo    nanoseconds d = tp.time_since_epoch();
55195618Srpaulo    timespec ts;
56195618Srpaulo    seconds s = duration_cast<seconds>(d);
57195618Srpaulo    ts.tv_sec = static_cast<decltype(ts.tv_sec)>(s.count());
58195618Srpaulo    ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((d - s).count());
59195618Srpaulo    int ec = pthread_cond_timedwait(&__cv_, lk.mutex()->native_handle(), &ts);
60195618Srpaulo    if (ec != 0 && ec != ETIMEDOUT)
61195618Srpaulo        __throw_system_error(ec, "condition_variable timed_wait failed");
62195618Srpaulo}
63195618Srpaulo
64195618Srpaulovoid
65195618Srpaulonotify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk)
66195618Srpaulo{
67195618Srpaulo    __thread_local_data()->notify_all_at_thread_exit(&cond, lk.release());
68195618Srpaulo}
69195618Srpaulo
70195618Srpaulo_LIBCPP_END_NAMESPACE_STD
71246512Smonthadar