Index: named_condition.hpp =================================================================== --- named_condition.hpp (revision 45782) +++ named_condition.hpp (working copy) @@ -146,23 +146,27 @@ template void do_wait(Lock& lock) { + //lock internal before unlocking external to avoid race with a notifier + scoped_lock internal_lock(*this->mutex()); lock_inverter inverted_lock(lock); + scoped_lock > external_unlock(inverted_lock); //unlock internal first to avoid deadlock with near simultaneous waits - scoped_lock > external_unlock(inverted_lock); - scoped_lock internal_lock(*this->mutex()); - this->condition()->wait(internal_lock); + scoped_lock internal_unlock; + internal_lock.swap(internal_unlock); + this->condition()->wait(internal_unlock); } template bool do_timed_wait(Lock& lock, const boost::posix_time::ptime &abs_time) { - //unlock internal first to avoid deadlock with near simultaneous waits + //lock internal before unlocking external to avoid race with a notifier + scoped_lock internal_lock(*this->mutex()); lock_inverter inverted_lock(lock); scoped_lock > external_unlock(inverted_lock); - if(!external_unlock) return false; - scoped_lock internal_lock(*this->mutex(), abs_time); - if(!internal_lock) return false; - return this->condition()->timed_wait(internal_lock, abs_time); + //unlock internal first to avoid deadlock with near simultaneous waits + scoped_lock internal_unlock; + internal_lock.swap(internal_unlock); + return this->condition()->timed_wait(internal_unlock, abs_time); } #endif