Ticket #1951: named_condition.hpp.patch

File named_condition.hpp.patch, 1.9 KB (added by Stas Maximov <smaximov@…>, 14 years ago)
  • named_condition.hpp

     
    146146   template <class Lock>
    147147   void do_wait(Lock& lock)
    148148   { 
     149      //lock internal before unlocking external to avoid race with a notifier
     150      scoped_lock<interprocess_mutex>     internal_lock(*this->mutex());
    149151      lock_inverter<Lock> inverted_lock(lock);
     152      scoped_lock<lock_inverter<Lock> >   external_unlock(inverted_lock);
    150153      //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);
    154157   }
    155158
    156159   template <class Lock>
    157160   bool do_timed_wait(Lock& lock, const boost::posix_time::ptime &abs_time)
    158161   {
    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());
    160164      lock_inverter<Lock> inverted_lock(lock);
    161165      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       if(!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);
    166170   }
    167171   #endif
    168172