Ticket #6200: thread_eintr.patch

File thread_eintr.patch, 2.7 KB (added by blentz@…, 11 years ago)

patch to correct for receiving EINTR in condition_variable and mutex.

  • boost/thread/pthread/condition_variable.hpp

    diff --git a/boost/thread/pthread/condition_variable.hpp b/boost/thread/pthread/condition_variable.hpp
    index 160c707..07e61f2 100644
    a b namespace boost  
    5252            thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
    5353            detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
    5454            guard.activate(m);
    55             res=pthread_cond_wait(&cond,&internal_mutex);
     55            int ret;
     56            do {
     57                ret = pthread_cond_wait(&cond,m.mutex()->native_handle());
     58            } while (ret == EINTR);
    5659        }
    5760        this_thread::interruption_point();
    5861        if(res)
  • boost/thread/pthread/condition_variable_fwd.hpp

    diff --git a/boost/thread/pthread/condition_variable_fwd.hpp b/boost/thread/pthread/condition_variable_fwd.hpp
    index 365f511..b94c735 100644
    a b namespace boost  
    4444        ~condition_variable()
    4545        {
    4646            BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex));
    47             BOOST_VERIFY(!pthread_cond_destroy(&cond));
     47            int ret;
     48            do {
     49                ret = pthread_cond_destroy(&cond);
     50            } while (ret == EINTR);
    4851        }
    4952
    5053        void wait(unique_lock<mutex>& m);
  • boost/thread/pthread/mutex.hpp

    diff --git a/boost/thread/pthread/mutex.hpp b/boost/thread/pthread/mutex.hpp
    index 2a326d7..4a4205d 100644
    a b namespace boost  
    4444        }
    4545        ~mutex()
    4646        {
    47             BOOST_VERIFY(!pthread_mutex_destroy(&m));
     47            int ret;
     48            do {
     49                ret = pthread_mutex_destroy(&m);
     50            } while (ret == EINTR);
    4851        }
    4952       
    5053        void lock()
    5154        {
    52             int const res=pthread_mutex_lock(&m);
    53             if(res)
    54             {
     55            int res;
     56            do {
     57                res = pthread_mutex_lock(&m);
     58            } while (res == EINTR);
     59
     60            if (res) {
    5561                boost::throw_exception(lock_error(res));
    5662            }
    5763        }
    5864
    5965        void unlock()
    6066        {
    61             BOOST_VERIFY(!pthread_mutex_unlock(&m));
     67            int ret;
     68            do {
     69                ret = pthread_mutex_unlock(&m);
     70            } while (ret == EINTR);
     71            BOOST_VERIFY(!ret);
    6272        }
    6373       
    6474        bool try_lock()
    6575        {
    66             int const res=pthread_mutex_trylock(&m);
     76            int res;
     77            do {
     78                res = pthread_mutex_trylock(&m);
     79            } while (res == EINTR);
    6780            if(res && (res!=EBUSY))
    6881            {
    6982                boost::throw_exception(lock_error(res));