diff options
Diffstat (limited to '3rdParty/Boost/src/boost/thread/pthread/condition_variable.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/thread/pthread/condition_variable.hpp | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/3rdParty/Boost/src/boost/thread/pthread/condition_variable.hpp b/3rdParty/Boost/src/boost/thread/pthread/condition_variable.hpp index 9c5bee2..160c707 100644 --- a/3rdParty/Boost/src/boost/thread/pthread/condition_variable.hpp +++ b/3rdParty/Boost/src/boost/thread/pthread/condition_variable.hpp @@ -47,27 +47,39 @@ namespace boost inline void condition_variable::wait(unique_lock<mutex>& m) { - thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard; - detail::interruption_checker check_for_interruption(&internal_mutex,&cond); - guard.activate(m); - int const res=pthread_cond_wait(&cond,&internal_mutex); - BOOST_ASSERT(!res); + int res=0; + { + thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard; + detail::interruption_checker check_for_interruption(&internal_mutex,&cond); + guard.activate(m); + res=pthread_cond_wait(&cond,&internal_mutex); + } this_thread::interruption_point(); + if(res) + { + boost::throw_exception(condition_error()); + } } inline bool condition_variable::timed_wait(unique_lock<mutex>& m,boost::system_time const& wait_until) { thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard; - detail::interruption_checker check_for_interruption(&internal_mutex,&cond); - guard.activate(m); - struct timespec const timeout=detail::get_timespec(wait_until); - int const cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout); + int cond_res; + { + detail::interruption_checker check_for_interruption(&internal_mutex,&cond); + guard.activate(m); + struct timespec const timeout=detail::get_timespec(wait_until); + cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout); + } this_thread::interruption_point(); if(cond_res==ETIMEDOUT) { return false; } - BOOST_ASSERT(!cond_res); + if(cond_res) + { + boost::throw_exception(condition_error()); + } return true; } @@ -121,8 +133,8 @@ namespace boost detail::interruption_checker check_for_interruption(&internal_mutex,&cond); guard.activate(m); res=pthread_cond_wait(&cond,&internal_mutex); - this_thread::interruption_point(); } + this_thread::interruption_point(); if(res) { boost::throw_exception(condition_error()); @@ -145,8 +157,8 @@ namespace boost detail::interruption_checker check_for_interruption(&internal_mutex,&cond); guard.activate(m); res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout); - this_thread::interruption_point(); } + this_thread::interruption_point(); if(res==ETIMEDOUT) { return false; |