Ticket #4978: deadlock.patch
File deadlock.patch, 3.0 KB (added by , 12 years ago) |
---|
-
boost/thread/pthread/condition_variable.hpp
old new 48 48 inline void condition_variable::wait(unique_lock<mutex>& m) 49 49 { 50 50 thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard; 51 detail::interruption_checker check_for_interruption(&internal_mutex,&cond); 52 guard.activate(m); 53 int const res=pthread_cond_wait(&cond,&internal_mutex); 54 BOOST_ASSERT(!res); 51 { 52 detail::interruption_checker check_for_interruption(&internal_mutex,&cond); 53 guard.activate(m); 54 int const res=pthread_cond_wait(&cond,&internal_mutex); 55 BOOST_ASSERT(!res); 56 } 55 57 this_thread::interruption_point(); 56 58 } 57 59 58 60 inline bool condition_variable::timed_wait(unique_lock<mutex>& m,boost::system_time const& wait_until) 59 61 { 62 int cond_res; 60 63 thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard; 61 detail::interruption_checker check_for_interruption(&internal_mutex,&cond); 62 guard.activate(m); 63 struct timespec const timeout=detail::get_timespec(wait_until); 64 int const cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout); 64 { 65 detail::interruption_checker check_for_interruption(&internal_mutex,&cond); 66 guard.activate(m); 67 struct timespec const timeout=detail::get_timespec(wait_until); 68 cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout); 69 } 65 70 this_thread::interruption_point(); 66 71 if(cond_res==ETIMEDOUT) 67 72 { … … 118 123 int res=0; 119 124 { 120 125 thread_cv_detail::lock_on_exit<lock_type> guard; 121 detail::interruption_checker check_for_interruption(&internal_mutex,&cond); 122 guard.activate(m); 123 res=pthread_cond_wait(&cond,&internal_mutex); 126 { 127 detail::interruption_checker check_for_interruption(&internal_mutex,&cond); 128 guard.activate(m); 129 res=pthread_cond_wait(&cond,&internal_mutex); 130 } 124 131 this_thread::interruption_point(); 125 132 } 126 133 if(res) … … 142 149 int res=0; 143 150 { 144 151 thread_cv_detail::lock_on_exit<lock_type> guard; 145 detail::interruption_checker check_for_interruption(&internal_mutex,&cond); 146 guard.activate(m); 147 res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout); 152 { 153 detail::interruption_checker check_for_interruption(&internal_mutex,&cond); 154 guard.activate(m); 155 res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout); 156 } 148 157 this_thread::interruption_point(); 149 158 } 150 159 if(res==ETIMEDOUT)