Re: [Boost-bugs] [Boost C++ Libraries] #9284: WaitForSingleObject(mutex) must handle WAIT_ABANDONED

Subject: Re: [Boost-bugs] [Boost C++ Libraries] #9284: WaitForSingleObject(mutex) must handle WAIT_ABANDONED
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2013-10-29 02:26:29


#9284: WaitForSingleObject(mutex) must handle WAIT_ABANDONED
-------------------------------+--------------------------
  Reporter: huyuguang@… | Owner: igaztanaga
      Type: Bugs | Status: new
 Milestone: To Be Determined | Component: interprocess
   Version: Boost 1.54.0 | Severity: Problem
Resolution: | Keywords:
-------------------------------+--------------------------

Comment (by anonymous):

 void lock()
    {
       unsigned long ret = winapi::wait_for_single_object(m_mtx_hnd,
 winapi::infinite_time);
       if(ret != winapi::wait_object_0){
          if(ret != winapi::wait_abandoned) {
             error_info err = system_error_code();
             throw interprocess_exception(err);
          } else {
             winapi::release_mutex(m_mtx_hnd);
             throw interprocess_exception(0, "wait_abandoned");
          }
       }
    }

    bool try_lock()
    {
       unsigned long ret = winapi::wait_for_single_object(m_mtx_hnd, 0);
       if(ret == winapi::wait_object_0){
          return true;
       }
       else if(ret == winapi::wait_timeout){
          return false;
       }
       else if(ret == winapi::wait_abandoned){
          winapi::release_mutex(m_mtx_hnd);
          throw interprocess_exception(0, "wait_abandoned");
       }
       else{
          error_info err = system_error_code();
          throw interprocess_exception(err);
       }
    }

    bool timed_lock(const boost::posix_time::ptime &abs_time)
    {
       if(abs_time == boost::posix_time::pos_infin){
          this->lock();
          return true;
       }

       boost::posix_time::ptime now = microsec_clock::universal_time();
       if(now >= abs_time){
          return false;
       }

       unsigned long ret = winapi::wait_for_single_object
          (m_mtx_hnd, (abs_time - now).total_milliseconds());
       if(ret == winapi::wait_object_0){
          return true;
       }
       else if(ret == winapi::wait_timeout){
          return false;
       }
       else if(ret == winapi::wait_abandoned){
          winapi::release_mutex(m_mtx_hnd);
          throw interprocess_exception(0, "wait_abandoned");
       }
       else{
          error_info err = system_error_code();
          throw interprocess_exception(err);
       }
    }

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/9284#comment:4>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:14 UTC