Ticket #2330: thread-interrupt.patch
File thread-interrupt.patch, 3.8 KB (added by , 14 years ago) |
---|
-
boost/thread/pthread/condition_variable.hpp
old new 14 14 15 15 namespace boost 16 16 { 17 17 inline void condition_variable::wait(unique_lock<mutex>& m) 18 18 { 19 detail::interruption_checker check_for_interruption(&cond);19 detail::interruption_checker check_for_interruption(&cond,m.mutex()->native_handle()); 20 20 BOOST_VERIFY(!pthread_cond_wait(&cond,m.mutex()->native_handle())); 21 21 } 22 22 23 23 inline bool condition_variable::timed_wait(unique_lock<mutex>& m,boost::system_time const& wait_until) 24 24 { 25 detail::interruption_checker check_for_interruption(&cond);25 detail::interruption_checker check_for_interruption(&cond,m.mutex()->native_handle()); 26 26 struct timespec const timeout=detail::get_timespec(wait_until); 27 27 int const cond_res=pthread_cond_timedwait(&cond,m.mutex()->native_handle(),&timeout); 28 28 if(cond_res==ETIMEDOUT) 29 29 { 30 30 return false; -
boost/thread/pthread/thread_data.hpp
old new 42 42 bool joined; 43 43 boost::detail::thread_exit_callback_node* thread_exit_callbacks; 44 44 boost::detail::tss_data_node* tss_data; 45 45 bool interrupt_enabled; 46 46 bool interrupt_requested; 47 pthread_mutex_t* cond_mutex; 47 48 pthread_cond_t* current_cond; 48 49 49 50 thread_data_base(): 50 51 done(false),join_started(false),joined(false), 51 52 thread_exit_callbacks(0),tss_data(0), … … 75 76 } 76 77 } 77 78 78 79 void operator=(interruption_checker&); 79 80 public: 80 explicit interruption_checker(pthread_cond_t* cond): 81 explicit interruption_checker(pthread_cond_t* cond, 82 pthread_mutex_t* m): 81 83 thread_info(detail::get_current_thread_data()) 82 84 { 83 85 if(thread_info && thread_info->interrupt_enabled) 84 86 { 85 87 lock_guard<mutex> guard(thread_info->data_mutex); 86 88 check_for_interruption(); 87 89 thread_info->current_cond=cond; 90 thread_info->cond_mutex=m; 88 91 } 89 92 } 90 93 ~interruption_checker() 91 94 { 92 95 if(thread_info && thread_info->interrupt_enabled) 93 96 { 94 97 lock_guard<mutex> guard(thread_info->data_mutex); 95 98 thread_info->current_cond=NULL; 99 thread_info->cond_mutex=NULL; 96 100 check_for_interruption(); 97 101 } 98 102 } 99 103 }; 100 104 } -
libs/thread/src/pthread/thread.cpp
old new 418 418 void thread::interrupt() 419 419 { 420 420 detail::thread_data_ptr const local_thread_info=get_thread_info(); 421 421 if(local_thread_info) 422 422 { 423 pthread_cond_t* current_cond; 424 pthread_mutex_t* cond_mutex; 425 { 423 426 lock_guard<mutex> lk(local_thread_info->data_mutex); 424 427 local_thread_info->interrupt_requested=true; 425 if(local_thread_info->current_cond) 426 { 427 BOOST_VERIFY(!pthread_cond_broadcast(local_thread_info->current_cond)); 428 } 428 current_cond = local_thread_info->current_cond; 429 cond_mutex = local_thread_info->cond_mutex; 430 } 431 if(current_cond) 432 { 433 BOOST_VERIFY(!pthread_mutex_lock(cond_mutex)); 434 BOOST_VERIFY(!pthread_cond_broadcast(current_cond)); 435 BOOST_VERIFY(!pthread_mutex_unlock(cond_mutex)); 436 } 429 437 } 430 438 } 431 439 432 440 bool thread::interruption_requested() const 433 441 {