Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r86511 - in trunk: boost/interprocess/detail boost/interprocess/sync boost/interprocess/sync/detail boost/interprocess/sync/posix boost/interprocess/sync/shm boost/interprocess/sync/spin boost/interprocess/sync/windows libs/interprocess/doc libs/interprocess/test
From: igaztanaga_at_[hidden]
Date: 2013-10-29 03:39:22


Author: igaztanaga
Date: 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013)
New Revision: 86511
URL: http://svn.boost.org/trac/boost/changeset/86511

Log:
Simplified, refactored and unified (timed_)lock code based on try_lock(). There were several bugs in when handling timeout expirations.

Added:
   trunk/boost/interprocess/sync/detail/common_algorithms.hpp (contents, props changed)
   trunk/boost/interprocess/sync/windows/winapi_wrapper_common.hpp (contents, props changed)
Text files modified:
   trunk/boost/interprocess/detail/os_file_functions.hpp | 2
   trunk/boost/interprocess/detail/robust_emulation.hpp | 63 +---------------------------
   trunk/boost/interprocess/sync/detail/common_algorithms.hpp | 73 +++++++++++++++++++++++++++++++++
   trunk/boost/interprocess/sync/detail/condition_algorithm_8a.hpp | 8 ---
   trunk/boost/interprocess/sync/detail/condition_any_algorithm.hpp | 8 ---
   trunk/boost/interprocess/sync/detail/locks.hpp | 27 ++++++++++++
   trunk/boost/interprocess/sync/file_lock.hpp | 84 ++------------------------------------
   trunk/boost/interprocess/sync/interprocess_sharable_mutex.hpp | 14 ++---
   trunk/boost/interprocess/sync/interprocess_upgradable_mutex.hpp | 24 +++-------
   trunk/boost/interprocess/sync/named_recursive_mutex.hpp | 8 ---
   trunk/boost/interprocess/sync/named_semaphore.hpp | 8 ---
   trunk/boost/interprocess/sync/posix/condition.hpp | 11 ++--
   trunk/boost/interprocess/sync/posix/mutex.hpp | 24 +---------
   trunk/boost/interprocess/sync/posix/named_mutex.hpp | 8 ---
   trunk/boost/interprocess/sync/posix/ptime_to_timespec.hpp | 4 +
   trunk/boost/interprocess/sync/posix/recursive_mutex.hpp | 22 +--------
   trunk/boost/interprocess/sync/posix/semaphore_wrapper.hpp | 16 +++----
   trunk/boost/interprocess/sync/shm/named_mutex.hpp | 8 ---
   trunk/boost/interprocess/sync/shm/named_recursive_mutex.hpp | 8 ---
   trunk/boost/interprocess/sync/shm/named_semaphore.hpp | 8 ---
   trunk/boost/interprocess/sync/shm/named_upgradable_mutex.hpp | 24 +---------
   trunk/boost/interprocess/sync/spin/condition.hpp | 10 ++-
   trunk/boost/interprocess/sync/spin/mutex.hpp | 40 +-----------------
   trunk/boost/interprocess/sync/spin/recursive_mutex.hpp | 5 -
   trunk/boost/interprocess/sync/spin/semaphore.hpp | 33 ++------------
   trunk/boost/interprocess/sync/windows/named_condition_any.hpp | 2
   trunk/boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp | 51 ++---------------------
   trunk/boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp | 48 +--------------------
   trunk/boost/interprocess/sync/windows/winapi_wrapper_common.hpp | 86 ++++++++++++++++++++++++++++++++++++++++
   trunk/libs/interprocess/doc/interprocess.qbk | 5 ++
   trunk/libs/interprocess/test/file_lock_test.cpp | 4
   trunk/libs/interprocess/test/util.hpp | 2
   32 files changed, 276 insertions(+), 462 deletions(-)

Modified: trunk/boost/interprocess/detail/os_file_functions.hpp
==============================================================================
--- trunk/boost/interprocess/detail/os_file_functions.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/detail/os_file_functions.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -136,7 +136,7 @@
    typedef boost::make_unsigned<offset_t>::type uoffset_t;
    const uoffset_t max_filesize = uoffset_t((std::numeric_limits<offset_t>::max)());
    //Avoid unused variable warnings in 32 bit systems
- if(size > max_filesize){
+ if(uoffset_t(size) > max_filesize){
       winapi::set_last_error(winapi::error_file_too_large);
       return false;
    }

Modified: trunk/boost/interprocess/detail/robust_emulation.hpp
==============================================================================
--- trunk/boost/interprocess/detail/robust_emulation.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/detail/robust_emulation.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -25,6 +25,7 @@
 #include <boost/interprocess/detail/intermodule_singleton.hpp>
 #include <boost/interprocess/exceptions.hpp>
 #include <boost/interprocess/sync/spin/wait.hpp>
+#include <boost/interprocess/sync/detail/common_algorithms.hpp>
 #include <string>
 
 namespace boost{
@@ -215,38 +216,7 @@
 
 template<class Mutex>
 inline void robust_spin_mutex<Mutex>::lock()
-{
- //If the mutex is broken (recovery didn't call consistent()),
- //then throw an exception
- if(atomic_read32(&this->state) == broken_state){
- throw interprocess_exception(lock_error, "Broken id");
- }
-
- //This function provokes intermodule_singleton instantiation
- if(!this->lock_own_unique_file()){
- throw interprocess_exception(lock_error, "Broken id");
- }
-
- //Now the logic. Try to lock, if successful mark the owner
- //if it fails, start recovery logic
- spin_wait swait;
- while(1){
- if (mtx.try_lock()){
- atomic_write32(&this->owner, get_current_process_id());
- break;
- }
- else{
- //Do the dead owner checking each spin_threshold lock tries
- swait.yield();
- if(0 == (swait.count() & 255u)){
- //Check if owner dead and take ownership if possible
- if(this->robust_check()){
- break;
- }
- }
- }
- }
-}
+{ try_based_lock(*this); }
 
 template<class Mutex>
 inline bool robust_spin_mutex<Mutex>::try_lock()
@@ -277,34 +247,7 @@
 template<class Mutex>
 inline bool robust_spin_mutex<Mutex>::timed_lock
    (const boost::posix_time::ptime &abs_time)
-{
- //Same as lock() but with an additional timeout
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- //Obtain current count and target time
- boost::posix_time::ptime now = microsec_clock::universal_time();
-
- if(now >= abs_time)
- return this->try_lock();
-
- spin_wait swait;
- do{
- if(this->try_lock()){
- break;
- }
- now = microsec_clock::universal_time();
-
- if(now >= abs_time){
- return this->try_lock();
- }
- // relinquish current time slice
- swait.yield();
- }while (true);
-
- return true;
-}
+{ return try_based_timed_lock(*this, abs_time); }
 
 template<class Mutex>
 inline void robust_spin_mutex<Mutex>::owner_to_filename(boost::uint32_t own, std::string &s)

Added: trunk/boost/interprocess/sync/detail/common_algorithms.hpp
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/boost/interprocess/sync/detail/common_algorithms.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -0,0 +1,73 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2012-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTERPROCESS_SYNC_DETAIL_COMMON_ALGORITHMS_HPP
+#define BOOST_INTERPROCESS_SYNC_DETAIL_COMMON_ALGORITHMS_HPP
+
+#include <boost/interprocess/detail/config_begin.hpp>
+#include <boost/interprocess/detail/workaround.hpp>
+
+#include <boost/interprocess/sync/spin/wait.hpp>
+
+namespace boost {
+namespace interprocess {
+namespace ipcdetail {
+
+template<class MutexType>
+bool try_based_timed_lock(MutexType &m, const boost::posix_time::ptime &abs_time)
+{
+ //Same as lock()
+ if(abs_time == boost::posix_time::pos_infin){
+ m.lock();
+ return true;
+ }
+ //Always try to lock to achieve POSIX guarantees:
+ // "Under no circumstance shall the function fail with a timeout if the mutex
+ // can be locked immediately. The validity of the abs_timeout parameter need not
+ // be checked if the mutex can be locked immediately."
+ else if(m.try_lock()){
+ return true;
+ }
+ else{
+ spin_wait swait;
+ while(microsec_clock::universal_time() < abs_time){
+ if(m.try_lock()){
+ return true;
+ }
+ swait.yield();
+ }
+ return false;
+ }
+}
+
+template<class MutexType>
+void try_based_lock(MutexType &m)
+{
+ if(!m.try_lock()){
+ spin_wait swait;
+ do{
+ if(m.try_lock()){
+ break;
+ }
+ else{
+ swait.yield();
+ }
+ }
+ while(1);
+ }
+}
+
+} //namespace ipcdetail
+} //namespace interprocess
+} //namespace boost
+
+#include <boost/interprocess/detail/config_end.hpp>
+
+#endif //BOOST_INTERPROCESS_SYNC_DETAIL_COMMON_ALGORITHMS_HPP

Modified: trunk/boost/interprocess/sync/detail/condition_algorithm_8a.hpp
==============================================================================
--- trunk/boost/interprocess/sync/detail/condition_algorithm_8a.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/detail/condition_algorithm_8a.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -360,10 +360,6 @@
    template <typename L>
    bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time)
    {
- if(abs_time == boost::posix_time::pos_infin){
- this->wait(lock);
- return true;
- }
       if (!lock)
          throw lock_exception();
       return algo_type::wait(m_data, lock, true, abs_time);
@@ -372,10 +368,6 @@
    template <typename L, typename Pr>
    bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred)
    {
- if(abs_time == boost::posix_time::pos_infin){
- this->wait(lock, pred);
- return true;
- }
       if (!lock)
             throw lock_exception();
       while (!pred()){

Modified: trunk/boost/interprocess/sync/detail/condition_any_algorithm.hpp
==============================================================================
--- trunk/boost/interprocess/sync/detail/condition_any_algorithm.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/detail/condition_any_algorithm.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -189,10 +189,6 @@
    template <typename L>
    bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time)
    {
- if(abs_time == boost::posix_time::pos_infin){
- this->wait(lock);
- return true;
- }
       if (!lock)
          throw lock_exception();
       return algo_type::wait(m_data, lock, true, abs_time);
@@ -201,10 +197,6 @@
    template <typename L, typename Pr>
    bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred)
    {
- if(abs_time == boost::posix_time::pos_infin){
- this->wait(lock, pred);
- return true;
- }
       if (!lock)
             throw lock_exception();
       while (!pred()){

Modified: trunk/boost/interprocess/sync/detail/locks.hpp
==============================================================================
--- trunk/boost/interprocess/sync/detail/locks.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/detail/locks.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -57,6 +57,33 @@
    void unlock() { l_.lock(); }
 };
 
+template <class Lock>
+class lock_to_sharable
+{
+ Lock &l_;
+
+ public:
+ explicit lock_to_sharable(Lock &l)
+ : l_(l)
+ {}
+ void lock() { l_.lock_sharable(); }
+ bool try_lock(){ return l_.try_lock_sharable(); }
+ void unlock() { l_.unlock_sharable(); }
+};
+
+template <class Lock>
+class lock_to_wait
+{
+ Lock &l_;
+
+ public:
+ explicit lock_to_wait(Lock &l)
+ : l_(l)
+ {}
+ void lock() { l_.wait(); }
+ bool try_lock(){ return l_.try_wait(); }
+};
+
 } //namespace ipcdetail
 } //namespace interprocess
 } //namespace boost

Modified: trunk/boost/interprocess/sync/file_lock.hpp
==============================================================================
--- trunk/boost/interprocess/sync/file_lock.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/file_lock.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -21,7 +21,8 @@
 #include <boost/interprocess/detail/os_file_functions.hpp>
 #include <boost/interprocess/detail/os_thread_functions.hpp>
 #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
-#include <boost/interprocess/sync/spin/wait.hpp>
+#include <boost/interprocess/sync/detail/common_algorithms.hpp>
+#include <boost/interprocess/sync/detail/locks.hpp>
 #include <boost/move/move.hpp>
 
 //!\file
@@ -142,62 +143,6 @@
    private:
    file_handle_t m_file_hnd;
 
- bool timed_acquire_file_lock
- (file_handle_t hnd, bool &acquired, const boost::posix_time::ptime &abs_time)
- {
- //Obtain current count and target time
- boost::posix_time::ptime now = microsec_clock::universal_time();
- using namespace boost::detail;
-
- if(now >= abs_time) return false;
- spin_wait swait;
- do{
- if(!ipcdetail::try_acquire_file_lock(hnd, acquired))
- return false;
-
- if(acquired)
- return true;
- else{
- now = microsec_clock::universal_time();
-
- if(now >= abs_time){
- acquired = false;
- return true;
- }
- // relinquish current time slice
- swait.yield();
- }
- }while (true);
- }
-
- bool timed_acquire_file_lock_sharable
- (file_handle_t hnd, bool &acquired, const boost::posix_time::ptime &abs_time)
- {
- //Obtain current count and target time
- boost::posix_time::ptime now = microsec_clock::universal_time();
- using namespace boost::detail;
-
- if(now >= abs_time) return false;
-
- spin_wait swait;
- do{
- if(!ipcdetail::try_acquire_file_lock_sharable(hnd, acquired))
- return false;
-
- if(acquired)
- return true;
- else{
- now = microsec_clock::universal_time();
-
- if(now >= abs_time){
- acquired = false;
- return true;
- }
- // relinquish current time slice
- swait.yield();
- }
- }while (true);
- }
    /// @endcond
 };
 
@@ -238,18 +183,7 @@
 }
 
 inline bool file_lock::timed_lock(const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- bool result;
- if(!this->timed_acquire_file_lock(m_file_hnd, result, abs_time)){
- error_info err(system_error_code());
- throw interprocess_exception(err);
- }
- return result;
-}
+{ return ipcdetail::try_based_timed_lock(*this, abs_time); }
 
 inline void file_lock::unlock()
 {
@@ -279,16 +213,8 @@
 
 inline bool file_lock::timed_lock_sharable(const boost::posix_time::ptime &abs_time)
 {
- if(abs_time == boost::posix_time::pos_infin){
- this->lock_sharable();
- return true;
- }
- bool result;
- if(!this->timed_acquire_file_lock_sharable(m_file_hnd, result, abs_time)){
- error_info err(system_error_code());
- throw interprocess_exception(err);
- }
- return result;
+ ipcdetail::lock_to_sharable<file_lock> lsh(*this);
+ return ipcdetail::try_based_timed_lock(lsh, abs_time);
 }
 
 inline void file_lock::unlock_sharable()

Modified: trunk/boost/interprocess/sync/interprocess_sharable_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/interprocess_sharable_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/interprocess_sharable_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -213,16 +213,14 @@
 inline bool interprocess_sharable_mutex::timed_lock
    (const boost::posix_time::ptime &abs_time)
 {
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
    scoped_lock_t lck(m_mut, abs_time);
    if(!lck.owns()) return false;
 
    //The exclusive lock must block in the first gate
    //if an exclusive lock has been acquired
    while (this->m_ctrl.exclusive_in){
+ //Mutexes and condvars handle just fine infinite abs_times
+ //so avoid checking it here
       if(!this->m_first_gate.timed_wait(lck, abs_time)){
          if(this->m_ctrl.exclusive_in){
             return false;
@@ -239,6 +237,8 @@
 
    //Now wait until all readers are gone
    while (this->m_ctrl.num_shared){
+ //Mutexes and condvars handle just fine infinite abs_times
+ //so avoid checking it here
       if(!this->m_second_gate.timed_wait(lck, abs_time)){
          if(this->m_ctrl.num_shared){
             return false;
@@ -296,10 +296,6 @@
 inline bool interprocess_sharable_mutex::timed_lock_sharable
    (const boost::posix_time::ptime &abs_time)
 {
- if(abs_time == boost::posix_time::pos_infin){
- this->lock_sharable();
- return true;
- }
    scoped_lock_t lck(m_mut, abs_time);
    if(!lck.owns()) return false;
 
@@ -308,6 +304,8 @@
    //or there are too many sharable locks
    while (this->m_ctrl.exclusive_in
          || this->m_ctrl.num_shared == constants::max_readers){
+ //Mutexes and condvars handle just fine infinite abs_times
+ //so avoid checking it here
       if(!this->m_first_gate.timed_wait(lck, abs_time)){
          if(this->m_ctrl.exclusive_in
                || this->m_ctrl.num_shared == constants::max_readers){

Modified: trunk/boost/interprocess/sync/interprocess_upgradable_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/interprocess_upgradable_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/interprocess_upgradable_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -325,10 +325,8 @@
 inline bool interprocess_upgradable_mutex::timed_lock
    (const boost::posix_time::ptime &abs_time)
 {
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
+ //Mutexes and condvars handle just fine infinite abs_times
+ //so avoid checking it here
    scoped_lock_t lck(m_mut, abs_time);
    if(!lck.owns()) return false;
 
@@ -413,10 +411,8 @@
 inline bool interprocess_upgradable_mutex::timed_lock_upgradable
    (const boost::posix_time::ptime &abs_time)
 {
- if(abs_time == boost::posix_time::pos_infin){
- this->lock_upgradable();
- return true;
- }
+ //Mutexes and condvars handle just fine infinite abs_times
+ //so avoid checking it here
    scoped_lock_t lck(m_mut, abs_time);
    if(!lck.owns()) return false;
 
@@ -492,10 +488,8 @@
 inline bool interprocess_upgradable_mutex::timed_lock_sharable
    (const boost::posix_time::ptime &abs_time)
 {
- if(abs_time == boost::posix_time::pos_infin){
- this->lock_sharable();
- return true;
- }
+ //Mutexes and condvars handle just fine infinite abs_times
+ //so avoid checking it here
    scoped_lock_t lck(m_mut, abs_time);
    if(!lck.owns()) return false;
 
@@ -607,10 +601,8 @@
 inline bool interprocess_upgradable_mutex::timed_unlock_upgradable_and_lock
    (const boost::posix_time::ptime &abs_time)
 {
- if(abs_time == boost::posix_time::pos_infin){
- this->unlock_upgradable_and_lock();
- return true;
- }
+ //Mutexes and condvars handle just fine infinite abs_times
+ //so avoid checking it here
    scoped_lock_t lck(m_mut, abs_time);
    if(!lck.owns()) return false;
 

Modified: trunk/boost/interprocess/sync/named_recursive_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/named_recursive_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/named_recursive_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -143,13 +143,7 @@
 { return m_mut.try_lock(); }
 
 inline bool named_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- return m_mut.timed_lock(abs_time);
-}
+{ return m_mut.timed_lock(abs_time); }
 
 inline bool named_recursive_mutex::remove(const char *name)
 { return impl_t::remove(name); }

Modified: trunk/boost/interprocess/sync/named_semaphore.hpp
==============================================================================
--- trunk/boost/interprocess/sync/named_semaphore.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/named_semaphore.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -153,13 +153,7 @@
 { return m_sem.try_wait(); }
 
 inline bool named_semaphore::timed_wait(const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->wait();
- return true;
- }
- return m_sem.timed_wait(abs_time);
-}
+{ return m_sem.timed_wait(abs_time); }
 
 inline bool named_semaphore::remove(const char *name)
 { return impl_t::remove(name); }

Modified: trunk/boost/interprocess/sync/posix/condition.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/condition.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/posix/condition.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -83,12 +83,13 @@
    template <typename L>
    bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time)
    {
+ if (!lock)
+ throw lock_exception();
+ //Posix does not support infinity absolute time so handle it here
       if(abs_time == boost::posix_time::pos_infin){
          this->wait(lock);
          return true;
       }
- if (!lock)
- throw lock_exception();
       return this->do_timed_wait(abs_time, *lock.mutex());
    }
 
@@ -98,17 +99,17 @@
    template <typename L, typename Pr>
    bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred)
    {
+ if (!lock)
+ throw lock_exception();
+ //Posix does not support infinity absolute time so handle it here
       if(abs_time == boost::posix_time::pos_infin){
          this->wait(lock, pred);
          return true;
       }
- if (!lock)
- throw lock_exception();
       while (!pred()){
          if (!this->do_timed_wait(abs_time, *lock.mutex()))
             return pred();
       }
-
       return true;
    }
 

Modified: trunk/boost/interprocess/sync/posix/mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/posix/mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -44,7 +44,7 @@
 
 #ifndef BOOST_INTERPROCESS_POSIX_TIMEOUTS
 # include <boost/interprocess/detail/os_thread_functions.hpp>
-# include <boost/interprocess/sync/spin/wait.hpp>
+# include <boost/interprocess/sync/detail/common_algorithms.hpp>
 #endif
 #include <boost/assert.hpp>
 
@@ -103,12 +103,12 @@
 
 inline bool posix_mutex::timed_lock(const boost::posix_time::ptime &abs_time)
 {
+ #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
+ //Posix does not support infinity absolute time so handle it here
    if(abs_time == boost::posix_time::pos_infin){
       this->lock();
       return true;
    }
- #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
-
    timespec ts = ptime_to_timespec(abs_time);
    int res = pthread_mutex_timedlock(&m_mut, &ts);
    if (res != 0 && res != ETIMEDOUT)
@@ -117,23 +117,7 @@
 
    #else //BOOST_INTERPROCESS_POSIX_TIMEOUTS
 
- //Obtain current count and target time
- boost::posix_time::ptime now = microsec_clock::universal_time();
-
- spin_wait swait;
- do{
- if(this->try_lock()){
- break;
- }
- now = microsec_clock::universal_time();
-
- if(now >= abs_time){
- return false;
- }
- // relinquish current time slice
- swait.yield();
- }while (true);
- return true;
+ return ipcdetail::try_based_timed_lock(*this, abs_time);
 
    #endif //BOOST_INTERPROCESS_POSIX_TIMEOUTS
 }

Modified: trunk/boost/interprocess/sync/posix/named_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/named_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/posix/named_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -94,13 +94,7 @@
 { return m_sem.try_wait(); }
 
 inline bool posix_named_mutex::timed_lock(const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- return m_sem.timed_wait(abs_time);
-}
+{ return m_sem.timed_wait(abs_time); }
 
 inline bool posix_named_mutex::remove(const char *name)
 { return posix_named_semaphore::remove(name); }

Modified: trunk/boost/interprocess/sync/posix/ptime_to_timespec.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/ptime_to_timespec.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/posix/ptime_to_timespec.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -22,7 +22,9 @@
 inline timespec ptime_to_timespec (const boost::posix_time::ptime &tm)
 {
    const boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
- boost::posix_time::time_duration duration (tm - epoch);
+ //Avoid negative absolute times
+ boost::posix_time::time_duration duration = (tm <= epoch) ? boost::posix_time::time_duration(epoch - epoch)
+ : boost::posix_time::time_duration(tm - epoch);
    timespec ts;
    ts.tv_sec = duration.total_seconds();
    ts.tv_nsec = duration.total_nanoseconds() % 1000000000;

Modified: trunk/boost/interprocess/sync/posix/recursive_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/recursive_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/posix/recursive_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -38,7 +38,7 @@
 #include <boost/interprocess/exceptions.hpp>
 #ifndef BOOST_INTERPROCESS_POSIX_TIMEOUTS
 # include <boost/interprocess/detail/os_thread_functions.hpp>
-# include <boost/interprocess/sync/spin/wait.hpp>
+# include <boost/interprocess/sync/detail/common_algorithms.hpp>
 #endif
 #include <boost/assert.hpp>
 
@@ -93,11 +93,12 @@
 
 inline bool posix_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time)
 {
+ #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
+ //Posix does not support infinity absolute time so handle it here
    if(abs_time == boost::posix_time::pos_infin){
       this->lock();
       return true;
    }
- #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
 
    timespec ts = ptime_to_timespec(abs_time);
    int res = pthread_mutex_timedlock(&m_mut, &ts);
@@ -107,22 +108,7 @@
 
    #else //BOOST_INTERPROCESS_POSIX_TIMEOUTS
 
- //Obtain current count and target time
- boost::posix_time::ptime now = microsec_clock::universal_time();
- spin_wait swait;
- do{
- if(this->try_lock()){
- break;
- }
- now = microsec_clock::universal_time();
-
- if(now >= abs_time){
- return false;
- }
- // relinquish current time slice
- swait.yield();
- }while (true);
- return true;
+ return ipcdetail::try_based_timed_lock(*this, abs_time);
 
    #endif //BOOST_INTERPROCESS_POSIX_TIMEOUTS
 }

Modified: trunk/boost/interprocess/sync/posix/semaphore_wrapper.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/semaphore_wrapper.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/posix/semaphore_wrapper.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -174,11 +174,13 @@
 
 inline bool semaphore_timed_wait(sem_t *handle, const boost::posix_time::ptime &abs_time)
 {
+ #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
+ //Posix does not support infinity absolute time so handle it here
    if(abs_time == boost::posix_time::pos_infin){
       semaphore_wait(handle);
       return true;
    }
- #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
+
    timespec tspec = ptime_to_timespec(abs_time);
    for (;;){
       int res = sem_timedwait(handle, &tspec);
@@ -195,14 +197,10 @@
    }
    return false;
    #else //#ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
- boost::posix_time::ptime now;
- spin_wait swait;
- do{
- if(semaphore_try_wait(handle))
- return true;
- swait.yield();
- }while((now = microsec_clock::universal_time()) < abs_time);
- return false;
+
+ ipcdetail::lock_to_wait<> lw(*this);
+ return ipcdetail::try_based_timed_lock(lw, abs_time);
+
    #endif //#ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
 }
 

Modified: trunk/boost/interprocess/sync/shm/named_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/shm/named_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/shm/named_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -161,13 +161,7 @@
 { return this->internal_mutex().try_lock(); }
 
 inline bool shm_named_mutex::timed_lock(const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- return this->internal_mutex().timed_lock(abs_time);
-}
+{ return this->internal_mutex().timed_lock(abs_time); }
 
 inline bool shm_named_mutex::remove(const char *name)
 { return shared_memory_object::remove(name); }

Modified: trunk/boost/interprocess/sync/shm/named_recursive_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/shm/named_recursive_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/shm/named_recursive_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -153,13 +153,7 @@
 { return this->mutex()->try_lock(); }
 
 inline bool shm_named_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- return this->mutex()->timed_lock(abs_time);
-}
+{ return this->mutex()->timed_lock(abs_time); }
 
 inline bool shm_named_recursive_mutex::remove(const char *name)
 { return shared_memory_object::remove(name); }

Modified: trunk/boost/interprocess/sync/shm/named_semaphore.hpp
==============================================================================
--- trunk/boost/interprocess/sync/shm/named_semaphore.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/shm/named_semaphore.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -120,13 +120,7 @@
 { return semaphore()->try_wait(); }
 
 inline bool shm_named_semaphore::timed_wait(const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->wait();
- return true;
- }
- return semaphore()->timed_wait(abs_time);
-}
+{ return semaphore()->timed_wait(abs_time); }
 
 inline bool shm_named_semaphore::remove(const char *name)
 { return shared_memory_object::remove(name); }

Modified: trunk/boost/interprocess/sync/shm/named_upgradable_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/shm/named_upgradable_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/shm/named_upgradable_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -287,13 +287,7 @@
 
 inline bool named_upgradable_mutex::timed_lock
    (const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- return this->mutex()->timed_lock(abs_time);
-}
+{ return this->mutex()->timed_lock(abs_time); }
 
 inline void named_upgradable_mutex::lock_upgradable()
 { this->mutex()->lock_upgradable(); }
@@ -306,13 +300,7 @@
 
 inline bool named_upgradable_mutex::timed_lock_upgradable
    (const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock_upgradable();
- return true;
- }
- return this->mutex()->timed_lock_upgradable(abs_time);
-}
+{ return this->mutex()->timed_lock_upgradable(abs_time); }
 
 inline void named_upgradable_mutex::lock_sharable()
 { this->mutex()->lock_sharable(); }
@@ -325,13 +313,7 @@
 
 inline bool named_upgradable_mutex::timed_lock_sharable
    (const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock_sharable();
- return true;
- }
- return this->mutex()->timed_lock_sharable(abs_time);
-}
+{ return this->mutex()->timed_lock_sharable(abs_time); }
 
 inline void named_upgradable_mutex::unlock_and_lock_upgradable()
 { this->mutex()->unlock_and_lock_upgradable(); }

Modified: trunk/boost/interprocess/sync/spin/condition.hpp
==============================================================================
--- trunk/boost/interprocess/sync/spin/condition.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/spin/condition.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -41,24 +41,26 @@
    template <typename L>
    bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time)
    {
+ if (!lock)
+ throw lock_exception();
+ //Handle infinity absolute time here to avoid complications in do_timed_wait
       if(abs_time == boost::posix_time::pos_infin){
          this->wait(lock);
          return true;
       }
- if (!lock)
- throw lock_exception();
       return this->do_timed_wait(abs_time, *lock.mutex());
    }
 
    template <typename L, typename Pr>
    bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred)
    {
+ if (!lock)
+ throw lock_exception();
+ //Handle infinity absolute time here to avoid complications in do_timed_wait
       if(abs_time == boost::posix_time::pos_infin){
          this->wait(lock, pred);
          return true;
       }
- if (!lock)
- throw lock_exception();
       while (!pred()){
          if (!this->do_timed_wait(abs_time, *lock.mutex()))
             return pred();

Modified: trunk/boost/interprocess/sync/spin/mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/spin/mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/spin/mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -22,7 +22,7 @@
 #include <boost/interprocess/detail/atomic.hpp>
 #include <boost/cstdint.hpp>
 #include <boost/interprocess/detail/os_thread_functions.hpp>
-#include <boost/interprocess/sync/spin/wait.hpp>
+#include <boost/interprocess/sync/detail/common_algorithms.hpp>
 
 namespace boost {
 namespace interprocess {
@@ -60,18 +60,7 @@
 }
 
 inline void spin_mutex::lock(void)
-{
- spin_wait swait;
- do{
- boost::uint32_t prev_s = ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0);
-
- if (m_s == 1 && prev_s == 0){
- break;
- }
- // relinquish current timeslice
- swait.yield();
- }while (true);
-}
+{ return ipcdetail::try_based_lock(*this); }
 
 inline bool spin_mutex::try_lock(void)
 {
@@ -80,30 +69,7 @@
 }
 
 inline bool spin_mutex::timed_lock(const boost::posix_time::ptime &abs_time)
-{
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- //Obtain current count and target time
- boost::posix_time::ptime now = microsec_clock::universal_time();
-
- spin_wait swait;
- do{
- if(this->try_lock()){
- break;
- }
- now = microsec_clock::universal_time();
-
- if(now >= abs_time){
- return false;
- }
- // relinquish current time slice
- swait.yield();
- }while (true);
-
- return true;
-}
+{ return ipcdetail::try_based_timed_lock(*this, abs_time); }
 
 inline void spin_mutex::unlock(void)
 { ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 0, 1); }

Modified: trunk/boost/interprocess/sync/spin/recursive_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/spin/recursive_mutex.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/spin/recursive_mutex.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -118,10 +118,6 @@
 inline bool spin_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time)
 {
    typedef ipcdetail::OS_systemwide_thread_id_t handle_t;
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
    const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id());
    handle_t old_id;
    ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id);
@@ -133,6 +129,7 @@
       ++m_nLockCount;
       return true;
    }
+ //m_mutex supports abs_time so no need to check it
    if(m_mutex.timed_lock(abs_time)){
       ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner);
       m_nLockCount = 1;

Modified: trunk/boost/interprocess/sync/spin/semaphore.hpp
==============================================================================
--- trunk/boost/interprocess/sync/spin/semaphore.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/spin/semaphore.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -20,7 +20,8 @@
 #include <boost/interprocess/detail/atomic.hpp>
 #include <boost/interprocess/detail/os_thread_functions.hpp>
 #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
-#include <boost/interprocess/sync/spin/wait.hpp>
+#include <boost/interprocess/sync/detail/common_algorithms.hpp>
+#include <boost/interprocess/sync/detail/locks.hpp>
 #include <boost/cstdint.hpp>
 
 namespace boost {
@@ -60,10 +61,8 @@
 
 inline void spin_semaphore::wait()
 {
- spin_wait swait;
- while(!ipcdetail::atomic_add_unless32(&m_count, boost::uint32_t(-1), boost::uint32_t(0))){
- swait.yield();
- }
+ ipcdetail::lock_to_wait<spin_semaphore> lw(*this);
+ return ipcdetail::try_based_lock(lw);
 }
 
 inline bool spin_semaphore::try_wait()
@@ -73,30 +72,10 @@
 
 inline bool spin_semaphore::timed_wait(const boost::posix_time::ptime &abs_time)
 {
- if(abs_time == boost::posix_time::pos_infin){
- this->wait();
- return true;
- }
- //Obtain current count and target time
- boost::posix_time::ptime now(microsec_clock::universal_time());
-
- spin_wait swait;
- do{
- if(this->try_wait()){
- break;
- }
- now = microsec_clock::universal_time();
-
- if(now >= abs_time){
- return this->try_wait();
- }
- // relinquish current time slice
- swait.yield();
- }while (true);
- return true;
+ ipcdetail::lock_to_wait<spin_semaphore> lw(*this);
+ return ipcdetail::try_based_timed_lock(lw, abs_time);
 }
 
-
 //inline int spin_semaphore::get_count() const
 //{
    //return (int)ipcdetail::atomic_read32(&m_count);

Modified: trunk/boost/interprocess/sync/windows/named_condition_any.hpp
==============================================================================
--- trunk/boost/interprocess/sync/windows/named_condition_any.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/windows/named_condition_any.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -97,7 +97,7 @@
    /// @cond
    private:
 
- void windows_named_condition_any::dont_close_on_destruction()
+ void dont_close_on_destruction()
    {}
 
    friend class interprocess_tester;

Modified: trunk/boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp
==============================================================================
--- trunk/boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -21,6 +21,7 @@
 #include <boost/interprocess/permissions.hpp>
 #include <boost/interprocess/detail/win32_api.hpp>
 #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
+#include <boost/interprocess/sync/windows/winapi_wrapper_common.hpp>
 #include <boost/interprocess/errors.hpp>
 #include <boost/interprocess/exceptions.hpp>
 #include <limits>
@@ -44,58 +45,16 @@
    {}
 
    void unlock()
- {
- winapi::release_mutex(m_mtx_hnd);
- }
+ { winapi::release_mutex(m_mtx_hnd); }
 
    void lock()
- {
- if(winapi::wait_for_single_object(m_mtx_hnd, winapi::infinite_time) != winapi::wait_object_0){
- error_info err = system_error_code();
- throw interprocess_exception(err);
- }
- }
+ { return winapi_wrapper_wait_for_single_object(m_mtx_hnd); }
 
    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{
- error_info err = system_error_code();
- throw interprocess_exception(err);
- }
- }
+ { return winapi_wrapper_try_wait_for_single_object(m_mtx_hnd); }
 
    bool timed_lock(const boost::posix_time::ptime &abs_time)
- {
- if(abs_time == boost::posix_time::pos_infin){
- this->lock();
- return true;
- }
- const boost::posix_time::ptime cur_time = microsec_clock::universal_time();
- if(abs_time < cur_time){
- return false;
- }
- else{
- unsigned long ret = winapi::wait_for_single_object
- (m_mtx_hnd, (abs_time - cur_time).total_milliseconds());
- if(ret == winapi::wait_object_0){
- return true;
- }
- else if(ret == winapi::wait_timeout){
- return false;
- }
- else{
- error_info err = system_error_code();
- throw interprocess_exception(err);
- }
- }
- }
+ { return winapi_wrapper_timed_wait_for_single_object(m_mtx_hnd, abs_time); }
 
    /// @cond
    protected:

Modified: trunk/boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp
==============================================================================
--- trunk/boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -21,6 +21,7 @@
 #include <boost/interprocess/permissions.hpp>
 #include <boost/interprocess/detail/win32_api.hpp>
 #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
+#include <boost/interprocess/sync/windows/winapi_wrapper_common.hpp>
 #include <boost/interprocess/errors.hpp>
 #include <boost/interprocess/exceptions.hpp>
 #include <limits>
@@ -50,54 +51,13 @@
    }
 
    void wait()
- {
- if(winapi::wait_for_single_object(m_sem_hnd, winapi::infinite_time) != winapi::wait_object_0){
- error_info err = system_error_code();
- throw interprocess_exception(err);
- }
- }
+ { return winapi_wrapper_wait_for_single_object(m_sem_hnd); }
 
    bool try_wait()
- {
- unsigned long ret = winapi::wait_for_single_object(m_sem_hnd, 0);
- if(ret == winapi::wait_object_0){
- return true;
- }
- else if(ret == winapi::wait_timeout){
- return false;
- }
- else{
- error_info err = system_error_code();
- throw interprocess_exception(err);
- }
- }
+ { return winapi_wrapper_try_wait_for_single_object(m_sem_hnd); }
 
    bool timed_wait(const boost::posix_time::ptime &abs_time)
- {
- if(abs_time == boost::posix_time::pos_infin){
- this->wait();
- return true;
- }
-
- boost::posix_time::ptime cur_time = microsec_clock::universal_time();
- if(abs_time < cur_time){
- return false;
- }
- else{
- unsigned long ret = winapi::wait_for_single_object
- (m_sem_hnd, (abs_time - cur_time).total_milliseconds());
- if(ret == winapi::wait_object_0){
- return true;
- }
- else if(ret == winapi::wait_timeout){
- return false;
- }
- else{
- error_info err = system_error_code();
- throw interprocess_exception(err);
- }
- }
- }
+ { return winapi_wrapper_timed_wait_for_single_object(m_sem_hnd, abs_time); }
 
    long value() const
    {

Added: trunk/boost/interprocess/sync/windows/winapi_wrapper_common.hpp
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/boost/interprocess/sync/windows/winapi_wrapper_common.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -0,0 +1,86 @@
+ //////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/interprocess for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP
+#define BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/interprocess/detail/config_begin.hpp>
+#include <boost/interprocess/detail/workaround.hpp>
+#include <boost/interprocess/detail/win32_api.hpp>
+#include <boost/interprocess/detail/posix_time_types_wrk.hpp>
+#include <boost/interprocess/errors.hpp>
+#include <boost/interprocess/exceptions.hpp>
+#include <limits>
+
+namespace boost {
+namespace interprocess {
+namespace ipcdetail {
+
+inline void winapi_wrapper_wait_for_single_object(void *handle)
+{
+ if(winapi::wait_for_single_object(handle, winapi::infinite_time) != winapi::wait_object_0){
+ error_info err = system_error_code();
+ throw interprocess_exception(err);
+ }
+}
+
+inline bool winapi_wrapper_try_wait_for_single_object(void *handle)
+{
+ unsigned long ret = winapi::wait_for_single_object(handle, 0);
+ if(ret == winapi::wait_object_0){
+ return true;
+ }
+ else if(ret == winapi::wait_timeout){
+ return false;
+ }
+ else{
+ error_info err = system_error_code();
+ throw interprocess_exception(err);
+ }
+}
+
+inline bool winapi_wrapper_timed_wait_for_single_object(void *handle, const boost::posix_time::ptime &abs_time)
+{
+ //Windows does not support infinity abs_time so check it
+ if(abs_time == boost::posix_time::pos_infin){
+ winapi_wrapper_wait_for_single_object(handle);
+ return true;
+ }
+ const boost::posix_time::ptime cur_time = microsec_clock::universal_time();
+ //Windows uses relative wait times so check for negative waits
+ //and implement as 0 wait to allow try-semantics as POSIX mandates.
+ unsigned long ret = winapi::wait_for_single_object
+ ( handle
+ , (abs_time <= cur_time) ? 0u
+ : (abs_time - cur_time).total_milliseconds()
+ );
+ if(ret == winapi::wait_object_0){
+ return true;
+ }
+ else if(ret == winapi::wait_timeout){
+ return false;
+ }
+ else{
+ error_info err = system_error_code();
+ throw interprocess_exception(err);
+ }
+}
+
+} //namespace ipcdetail {
+} //namespace interprocess {
+} //namespace boost {
+
+#include <boost/interprocess/detail/config_end.hpp>
+
+#endif //BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP

Modified: trunk/libs/interprocess/doc/interprocess.qbk
==============================================================================
--- trunk/libs/interprocess/doc/interprocess.qbk Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/libs/interprocess/doc/interprocess.qbk 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -6717,11 +6717,16 @@
 * Fixed bugs:
    * [@https://svn.boost.org/trac/boost/ticket/9221 #9221 (['"message_queue deadlock on linux"])].
    * [@https://svn.boost.org/trac/boost/ticket/9226 #9226 (['"On some computers, Common Appdata is empty in registry, so boost interprocess cannot work"])].
+ * [@https://svn.boost.org/trac/boost/ticket/9285 #9285 (['"CreateMutex returns NULL if fails"])].
+ * [@https://svn.boost.org/trac/boost/ticket/9288 #9288 (['"timed_wait does not check if it has expired"])].
 
 * [*ABI breaking]: [@https://svn.boost.org/trac/boost/ticket/9221 #9221] showed
    that `BOOST_INTERPROCESS_MSG_QUEUE_CIRCULAR_INDEX` option of message queue,
    was completely broken so an ABI break was necessary to have a working implementation.
 
+* Simplified, refactored and unified (timed_)lock code based on try_lock().
+ There were several bugs in when handling timeout expirations.
+
 [endsect]
 
 [section:release_notes_boost_1_55_00 Boost 1.55 Release]

Modified: trunk/libs/interprocess/test/file_lock_test.cpp
==============================================================================
--- trunk/libs/interprocess/test/file_lock_test.cpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/libs/interprocess/test/file_lock_test.cpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -71,8 +71,8 @@
    }
 
    //test::test_all_lock<file_lock_lock_test_wrapper>();
- //test::test_all_mutex<false, file_lock_lock_test_wrapper>();
- //test::test_all_sharable_mutex<false, file_lock_lock_test_wrapper>();
+ //test::test_all_mutex<file_lock_lock_test_wrapper>();
+ //test::test_all_sharable_mutex<file_lock_lock_test_wrapper>();
    std::remove(get_filename().c_str());
 
    return 0;

Modified: trunk/libs/interprocess/test/util.hpp
==============================================================================
--- trunk/libs/interprocess/test/util.hpp Mon Oct 28 18:35:44 2013 (r86510)
+++ trunk/libs/interprocess/test/util.hpp 2013-10-29 03:39:21 EDT (Tue, 29 Oct 2013) (r86511)
@@ -76,7 +76,7 @@
 template <typename P>
 struct data
 {
- data(int id, int secs=0)
+ explicit data(int id, int secs=0)
       : m_id(id), m_value(-1), m_secs(secs), m_error(no_error)
    {}
    int m_id;


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk