Ticket #1951: named_condition.hpp.patch
File named_condition.hpp.patch, 1.9 KB (added by , 14 years ago) |
---|
-
named_condition.hpp
146 146 template <class Lock> 147 147 void do_wait(Lock& lock) 148 148 { 149 //lock internal before unlocking external to avoid race with a notifier 150 scoped_lock<interprocess_mutex> internal_lock(*this->mutex()); 149 151 lock_inverter<Lock> inverted_lock(lock); 152 scoped_lock<lock_inverter<Lock> > external_unlock(inverted_lock); 150 153 //unlock internal first to avoid deadlock with near simultaneous waits 151 scoped_lock< lock_inverter<Lock> > external_unlock(inverted_lock);152 scoped_lock<interprocess_mutex> internal_lock(*this->mutex());153 this->condition()->wait(internal_ lock);154 scoped_lock<interprocess_mutex> internal_unlock; 155 internal_lock.swap(internal_unlock); 156 this->condition()->wait(internal_unlock); 154 157 } 155 158 156 159 template <class Lock> 157 160 bool do_timed_wait(Lock& lock, const boost::posix_time::ptime &abs_time) 158 161 { 159 //unlock internal first to avoid deadlock with near simultaneous waits 162 //lock internal before unlocking external to avoid race with a notifier 163 scoped_lock<interprocess_mutex> internal_lock(*this->mutex()); 160 164 lock_inverter<Lock> inverted_lock(lock); 161 165 scoped_lock<lock_inverter<Lock> > external_unlock(inverted_lock); 162 if(!external_unlock) return false;163 scoped_lock<interprocess_mutex> internal_ lock(*this->mutex(), abs_time);164 i f(!internal_lock) return false;165 return this->condition()->timed_wait(internal_ lock, abs_time);166 //unlock internal first to avoid deadlock with near simultaneous waits 167 scoped_lock<interprocess_mutex> internal_unlock; 168 internal_lock.swap(internal_unlock); 169 return this->condition()->timed_wait(internal_unlock, abs_time); 166 170 } 167 171 #endif 168 172