Boost logo

Boost Users :

Subject: Re: [Boost-users] [Interprocess] deadlocking race condition in emulation interprocess_condition.hpp
From: Young, Zachariah L (zachariah.l.young_at_[hidden])
Date: 2009-09-16 23:20:29


Actually, why lock the m_check_mut at all?

Why not delete that whole thing and remove the m_check_mut from the class entirely, as it apparently exists only to synchronize the get and set of m_command on line 177 (before any edits), which is an atomic compare-and-set (ie, doesn't need synchronization)?

-Zach

 

-----Original Message-----
From: Young, Zachariah L
Sent: Wednesday, September 16, 2009 8:06 PM
To: 'boost-users_at_[hidden]'
Subject: RE: [Boost-users] [Interprocess] deadlocking race condition in emulation interprocess_condition.hpp

Hello Ion,

I have been looking at this code for awhile now and I am convinced that my original suggestion is not adequate. I am now getting deadlock with 4 waiters doing timed_waits on a tight timeout (now + 8ms) while using a single notify_all. I am wondering why abs_time is taken into consideration at all in the else clause, since the if clause is meant to handle the timeout case.

I believe that the following code:

         //Notification occurred, we will lock the checking interprocess_mutex so that
         //if a notify_one notification occurs, only one thread can exit
        //---------------------------------------------------------------
         InternalLock lock;
         if(tout_enabled){
            InternalLock dummy(m_check_mut, abs_time);
            lock = boost::interprocess::move(dummy);
         }
         else{
            InternalLock dummy(m_check_mut);
            lock = boost::interprocess::move(dummy);
         }

         if(!lock){
            detail::atomic_dec32(const_cast<boost::uint32_t*>(&m_num_waiters));
            timed_out = true;
            unlock_enter_mut = true;
            break;
         }
         //---------------------------------------------------------------

Should be changed to this:

         //Notification occurred, we will lock the checking interprocess_mutex so that
         //if a notify_one notification occurs, only one thread can exit
        //---------------------------------------------------------------
         InternalLock lock(m_check_mut);
         //---------------------------------------------------------------

I do not see the point of the abs_time consideration or the lock check.

Am I mistaken? Am I missing something?

-Zach

-----Original Message-----
From: Ion Gaztañaga [mailto:igaztanaga_at_[hidden]]
Sent: Wednesday, September 16, 2009 5:39 AM
To: boost-users_at_[hidden]
Subject: Re: [Boost-users] [Interprocess] deadlocking race conditionin emulation interprocess_condition.hpp

Young, Zachariah L escribió:

> My straightforward idea is to add the following line at line 172 of
> boost/interprocess/sync/emulation/interprocess_condition.hpp:
>
> if(!lock){
>
> detail::atomic_dec32(const_cast<boost::uint32_t*>(&m_num_waiters));
> timed_out = true;
> unlock_enter_mut = true;
> break;
> }

I think you are right. The count should be decremented because this thread will exit the wait logic .

thanks,

Ion
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net