Ticket #4978: deadlock.patch

File deadlock.patch, 3.0 KB (added by kosse@…, 12 years ago)

Experimental fix

  • boost/thread/pthread/condition_variable.hpp

    old new  
    4848    inline void condition_variable::wait(unique_lock<mutex>& m)
    4949    {
    5050        thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
    51         detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
    52         guard.activate(m);
    53         int const res=pthread_cond_wait(&cond,&internal_mutex);
    54         BOOST_ASSERT(!res);
     51        {
     52            detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
     53            guard.activate(m);
     54            int const res=pthread_cond_wait(&cond,&internal_mutex);
     55            BOOST_ASSERT(!res);
     56        }
    5557        this_thread::interruption_point();
    5658    }
    5759
    5860    inline bool condition_variable::timed_wait(unique_lock<mutex>& m,boost::system_time const& wait_until)
    5961    {
     62        int cond_res;
    6063        thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
    61         detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
    62         guard.activate(m);
    63         struct timespec const timeout=detail::get_timespec(wait_until);
    64         int const cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
     64        {
     65            detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
     66            guard.activate(m);
     67            struct timespec const timeout=detail::get_timespec(wait_until);
     68            cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
     69        }
    6570        this_thread::interruption_point();
    6671        if(cond_res==ETIMEDOUT)
    6772        {
     
    118123            int res=0;
    119124            {
    120125                thread_cv_detail::lock_on_exit<lock_type> guard;
    121                 detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
    122                 guard.activate(m);
    123                 res=pthread_cond_wait(&cond,&internal_mutex);
     126                {
     127                    detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
     128                    guard.activate(m);
     129                    res=pthread_cond_wait(&cond,&internal_mutex);               
     130                }
    124131                this_thread::interruption_point();
    125132            }
    126133            if(res)
     
    142149            int res=0;
    143150            {
    144151                thread_cv_detail::lock_on_exit<lock_type> guard;
    145                 detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
    146                 guard.activate(m);
    147                 res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
     152                {
     153                    detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
     154                    guard.activate(m);
     155                    res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
     156                }
    148157                this_thread::interruption_point();
    149158            }
    150159            if(res==ETIMEDOUT)