Index: third_party/libc++/src/condition_variable.cpp |
=================================================================== |
--- third_party/libc++/src/condition_variable.cpp (revision 0) |
+++ third_party/libc++/src/condition_variable.cpp (revision 0) |
@@ -0,0 +1,81 @@ |
+//===-------------------- condition_variable.cpp --------------------------===// |
+// |
+// The LLVM Compiler Infrastructure |
+// |
+// This file is dual licensed under the MIT and the University of Illinois Open |
+// Source Licenses. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#include "condition_variable" |
+#include "thread" |
+#include "system_error" |
+#include "cassert" |
+ |
+_LIBCPP_BEGIN_NAMESPACE_STD |
+ |
+condition_variable::~condition_variable() |
+{ |
+ pthread_cond_destroy(&__cv_); |
+} |
+ |
+void |
+condition_variable::notify_one() _NOEXCEPT |
+{ |
+ pthread_cond_signal(&__cv_); |
+} |
+ |
+void |
+condition_variable::notify_all() _NOEXCEPT |
+{ |
+ pthread_cond_broadcast(&__cv_); |
+} |
+ |
+void |
+condition_variable::wait(unique_lock<mutex>& lk) |
+{ |
+ if (!lk.owns_lock()) |
+ __throw_system_error(EPERM, |
+ "condition_variable::wait: mutex not locked"); |
+ int ec = pthread_cond_wait(&__cv_, lk.mutex()->native_handle()); |
+ if (ec) |
+ __throw_system_error(ec, "condition_variable wait failed"); |
+} |
+ |
+void |
+condition_variable::__do_timed_wait(unique_lock<mutex>& lk, |
+ chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp) |
+{ |
+ using namespace chrono; |
+ if (!lk.owns_lock()) |
+ __throw_system_error(EPERM, |
+ "condition_variable::timed wait: mutex not locked"); |
+ nanoseconds d = tp.time_since_epoch(); |
+ if (d > nanoseconds(0x59682F000000E941)) |
+ d = nanoseconds(0x59682F000000E941); |
+ timespec ts; |
+ seconds s = duration_cast<seconds>(d); |
+ typedef decltype(ts.tv_sec) ts_sec; |
+ _LIBCPP_CONSTEXPR ts_sec ts_sec_max = numeric_limits<ts_sec>::max(); |
+ if (s.count() < ts_sec_max) |
+ { |
+ ts.tv_sec = static_cast<ts_sec>(s.count()); |
+ ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((d - s).count()); |
+ } |
+ else |
+ { |
+ ts.tv_sec = ts_sec_max; |
+ ts.tv_nsec = giga::num - 1; |
+ } |
+ int ec = pthread_cond_timedwait(&__cv_, lk.mutex()->native_handle(), &ts); |
+ if (ec != 0 && ec != ETIMEDOUT) |
+ __throw_system_error(ec, "condition_variable timed_wait failed"); |
+} |
+ |
+void |
+notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk) |
+{ |
+ __thread_local_data()->notify_all_at_thread_exit(&cond, lk.release()); |
+} |
+ |
+_LIBCPP_END_NAMESPACE_STD |
Property changes on: third_party/libc++/src/condition_variable.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |