Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r76168 - in trunk/boost/interprocess: . detail sync sync/posix sync/shm sync/spin sync/windows
From: igaztanaga_at_[hidden]
Date: 2011-12-26 06:08:46


Author: igaztanaga
Date: 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
New Revision: 76168
URL: http://svn.boost.org/trac/boost/changeset/76168

Log:
Updated timed functions to fulfill posix requirements.
Text files modified:
   trunk/boost/interprocess/detail/os_file_functions.hpp | 11 ++-
   trunk/boost/interprocess/shared_memory_object.hpp | 4
   trunk/boost/interprocess/sync/named_mutex.hpp | 7 ++
   trunk/boost/interprocess/sync/posix/mutex.hpp | 2
   trunk/boost/interprocess/sync/posix/recursive_mutex.hpp | 2
   trunk/boost/interprocess/sync/posix/semaphore_wrapper.hpp | 4
   trunk/boost/interprocess/sync/shm/named_condition.hpp | 114 ++++++++++++++++++++++++++-------------
   trunk/boost/interprocess/sync/shm/named_mutex.hpp | 6 +-
   trunk/boost/interprocess/sync/shm/named_upgradable_mutex.hpp | 6 +-
   trunk/boost/interprocess/sync/spin/condition.hpp | 32 +++++-----
   trunk/boost/interprocess/sync/spin/mutex.hpp | 2
   trunk/boost/interprocess/sync/spin/recursive_mutex.hpp | 3
   trunk/boost/interprocess/sync/spin/semaphore.hpp | 2
   trunk/boost/interprocess/sync/windows/mutex.hpp | 25 +++-----
   trunk/boost/interprocess/sync/windows/semaphore.hpp | 25 +++-----
   15 files changed, 136 insertions(+), 109 deletions(-)

Modified: trunk/boost/interprocess/detail/os_file_functions.hpp
==============================================================================
--- trunk/boost/interprocess/detail/os_file_functions.hpp (original)
+++ trunk/boost/interprocess/detail/os_file_functions.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -18,6 +18,7 @@
 
 #include <string>
 #include <limits>
+#include <climits>
 
 #if (defined BOOST_INTERPROCESS_WINDOWS)
 # include <boost/interprocess/detail/win32_api.hpp>
@@ -448,11 +449,13 @@
 
 inline bool truncate_file (file_handle_t hnd, std::size_t size)
 {
- if(off_t(size) < 0){
- errno = EINVAL;
- return false;
+ if(sizeof(off_t) == sizeof(std::size_t)){
+ if(size > ((~std::size_t(0)) >> 1)){
+ errno = EINVAL;
+ return false;
+ }
    }
- return 0 == ::ftruncate(hnd, size);
+ return 0 == ::ftruncate(hnd, off_t(size));
 }
 
 inline bool get_file_size(file_handle_t hnd, offset_t &size)

Modified: trunk/boost/interprocess/shared_memory_object.hpp
==============================================================================
--- trunk/boost/interprocess/shared_memory_object.hpp (original)
+++ trunk/boost/interprocess/shared_memory_object.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -275,7 +275,7 @@
    #if defined(BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
    const bool add_leading_slash = false;
    #elif defined(BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
- const bool add_leading_slash = !shared_memory_object_ipcdetail::use_filesystem_based_posix();
+ const bool add_leading_slash = !shared_memory_object_detail::use_filesystem_based_posix();
    #else
    const bool add_leading_slash = true;
    #endif
@@ -361,7 +361,7 @@
       #if defined(BOOST_INTERPROCESS_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
       const bool add_leading_slash = false;
       #elif defined(BOOST_INTERPROCESS_RUNTIME_FILESYSTEM_BASED_POSIX_SHARED_MEMORY)
- const bool add_leading_slash = !shared_memory_object_ipcdetail::use_filesystem_based_posix();
+ const bool add_leading_slash = !shared_memory_object_detail::use_filesystem_based_posix();
       #else
       const bool add_leading_slash = true;
       #endif

Modified: trunk/boost/interprocess/sync/named_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/named_mutex.hpp (original)
+++ trunk/boost/interprocess/sync/named_mutex.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -106,10 +106,15 @@
 
    #if defined(BOOST_INTERPROCESS_NAMED_MUTEX_USES_POSIX_SEMAPHORES)
    typedef ipcdetail::posix_named_mutex impl_t;
+ impl_t m_mut;
    #else
    typedef ipcdetail::shm_named_mutex impl_t;
- #endif
    impl_t m_mut;
+ public:
+ interprocess_mutex *mutex() const
+ { return m_mut.mutex(); }
+ #endif
+
    /// @endcond
 };
 

Modified: trunk/boost/interprocess/sync/posix/mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/mutex.hpp (original)
+++ trunk/boost/interprocess/sync/posix/mutex.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -119,8 +119,6 @@
    //Obtain current count and target time
    boost::posix_time::ptime now = microsec_clock::universal_time();
 
- if(now >= abs_time) return false;
-
    do{
       if(this->try_lock()){
          break;

Modified: trunk/boost/interprocess/sync/posix/recursive_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/recursive_mutex.hpp (original)
+++ trunk/boost/interprocess/sync/posix/recursive_mutex.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -109,8 +109,6 @@
    //Obtain current count and target time
    boost::posix_time::ptime now = microsec_clock::universal_time();
 
- if(now >= abs_time) return false;
-
    do{
       if(this->try_lock()){
          break;

Modified: trunk/boost/interprocess/sync/posix/semaphore_wrapper.hpp
==============================================================================
--- trunk/boost/interprocess/sync/posix/semaphore_wrapper.hpp (original)
+++ trunk/boost/interprocess/sync/posix/semaphore_wrapper.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -195,11 +195,11 @@
    return false;
    #else //#ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
    boost::posix_time::ptime now;
- while((now = microsec_clock::universal_time()) < abs_time){
+ do{
       if(semaphore_try_wait(handle))
          return true;
       thread_yield();
- }
+ }while((now = microsec_clock::universal_time()) < abs_time);
    return false;
    #endif //#ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS
 }

Modified: trunk/boost/interprocess/sync/shm/named_condition.hpp
==============================================================================
--- trunk/boost/interprocess/sync/shm/named_condition.hpp (original)
+++ trunk/boost/interprocess/sync/shm/named_condition.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -148,42 +148,68 @@
    };
 
    #if defined (BOOST_INTERPROCESS_NAMED_MUTEX_USES_POSIX_SEMAPHORES)
- interprocess_mutex *mutex() const
- { return &static_cast<condition_holder*>(m_shmem.get_user_address())->mutex_; }
+ interprocess_mutex *mutex() const
+ { return &static_cast<condition_holder*>(m_shmem.get_user_address())->mutex_; }
 
- template <class Lock>
- void do_wait(Lock& lock)
- {
- //shm_named_condition only works with named_mutex
- BOOST_STATIC_ASSERT((is_convertible<typename Lock::mutex_type&, named_mutex&>::value == true));
-
- //lock internal before unlocking external to avoid race with a notifier
- scoped_lock<interprocess_mutex> internal_lock(*this->mutex());
- lock_inverter<Lock> inverted_lock(lock);
- scoped_lock<lock_inverter<Lock> > external_unlock(inverted_lock);
-
- //unlock internal first to avoid deadlock with near simultaneous waits
- scoped_lock<interprocess_mutex> internal_unlock;
- internal_lock.swap(internal_unlock);
- this->condition()->wait(internal_unlock);
- }
+ template <class Lock>
+ void do_wait(Lock& lock)
+ {
+ //shm_named_condition only works with named_mutex
+ BOOST_STATIC_ASSERT((is_convertible<typename Lock::mutex_type&, named_mutex&>::value == true));
+
+ //lock internal before unlocking external to avoid race with a notifier
+ scoped_lock<interprocess_mutex> internal_lock(*this->mutex());
+ lock_inverter<Lock> inverted_lock(lock);
+ scoped_lock<lock_inverter<Lock> > external_unlock(inverted_lock);
+
+ //unlock internal first to avoid deadlock with near simultaneous waits
+ scoped_lock<interprocess_mutex> internal_unlock;
+ internal_lock.swap(internal_unlock);
+ this->condition()->wait(internal_unlock);
+ }
 
- template <class Lock>
- bool do_timed_wait(Lock& lock, const boost::posix_time::ptime &abs_time)
- {
- //shm_named_condition only works with named_mutex
- BOOST_STATIC_ASSERT((is_convertible<typename Lock::mutex_type&, named_mutex&>::value == true));
- //lock internal before unlocking external to avoid race with a notifier
- scoped_lock<interprocess_mutex> internal_lock(*this->mutex(), abs_time);
- if(!internal_lock) return false;
- lock_inverter<Lock> inverted_lock(lock);
- scoped_lock<lock_inverter<Lock> > external_unlock(inverted_lock);
-
- //unlock internal first to avoid deadlock with near simultaneous waits
- scoped_lock<interprocess_mutex> internal_unlock;
- internal_lock.swap(internal_unlock);
- return this->condition()->timed_wait(internal_unlock, abs_time);
- }
+ template <class Lock>
+ bool do_timed_wait(Lock& lock, const boost::posix_time::ptime &abs_time)
+ {
+ //shm_named_condition only works with named_mutex
+ BOOST_STATIC_ASSERT((is_convertible<typename Lock::mutex_type&, named_mutex&>::value == true));
+ //lock internal before unlocking external to avoid race with a notifier
+ scoped_lock<interprocess_mutex> internal_lock(*this->mutex(), abs_time);
+ if(!internal_lock) return false;
+ lock_inverter<Lock> inverted_lock(lock);
+ scoped_lock<lock_inverter<Lock> > external_unlock(inverted_lock);
+
+ //unlock internal first to avoid deadlock with near simultaneous waits
+ scoped_lock<interprocess_mutex> internal_unlock;
+ internal_lock.swap(internal_unlock);
+ return this->condition()->timed_wait(internal_unlock, abs_time);
+ }
+ #else
+ template<class Lock>
+ class lock_wrapper
+ {
+ typedef void (lock_wrapper::*unspecified_bool_type)();
+ public:
+
+ typedef interprocess_mutex mutex_type;
+
+ lock_wrapper(Lock &l)
+ : l_(l)
+ {}
+
+ mutex_type* mutex() const
+ { return l_.mutex()->mutex(); }
+
+ void lock() { l_.lock(); }
+
+ void unlock() { l_.unlock(); }
+
+ operator unspecified_bool_type() const
+ { return l_ ? &lock_wrapper::lock : 0; }
+
+ private:
+ Lock &l_;
+ };
    #endif
 
    friend class boost::interprocess::ipcdetail::interprocess_tester;
@@ -309,21 +335,33 @@
 
 template <typename L>
 inline void shm_named_condition::wait(L& lock)
-{ this->condition()->wait(lock); }
+{
+ lock_wrapper<L> newlock(lock);
+ this->condition()->wait(newlock);
+}
 
 template <typename L, typename Pr>
 inline void shm_named_condition::wait(L& lock, Pr pred)
-{ this->condition()->wait(lock, pred); }
+{
+ lock_wrapper<L> newlock(lock);
+ this->condition()->wait(newlock, pred);
+}
 
 template <typename L>
 inline bool shm_named_condition::timed_wait
    (L& lock, const boost::posix_time::ptime &abs_time)
-{ return this->condition()->timed_wait(lock, abs_time); }
+{
+ lock_wrapper<L> newlock(lock);
+ return this->condition()->timed_wait(newlock, abs_time);
+}
 
 template <typename L, typename Pr>
 inline bool shm_named_condition::timed_wait
    (L& lock, const boost::posix_time::ptime &abs_time, Pr pred)
-{ return this->condition()->timed_wait(lock, abs_time, pred); }
+{
+ lock_wrapper<L> newlock(lock);
+ return this->condition()->timed_wait(newlock, abs_time, pred);
+}
 
 #endif
 

Modified: trunk/boost/interprocess/sync/shm/named_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/shm/named_mutex.hpp (original)
+++ trunk/boost/interprocess/sync/shm/named_mutex.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -100,13 +100,13 @@
    static bool remove(const char *name);
 
    /// @cond
+ interprocess_mutex *mutex() const
+ { return static_cast<interprocess_mutex*>(m_shmem.get_user_address()); }
+
    private:
    friend class ipcdetail::interprocess_tester;
    void dont_close_on_destruction();
 
- interprocess_mutex *mutex() const
- { return static_cast<interprocess_mutex*>(m_shmem.get_user_address()); }
-
    ipcdetail::managed_open_or_create_impl<shared_memory_object> m_shmem;
    typedef ipcdetail::named_creation_functor<interprocess_mutex> construct_func_t;
    /// @endcond

Modified: trunk/boost/interprocess/sync/shm/named_upgradable_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/shm/named_upgradable_mutex.hpp (original)
+++ trunk/boost/interprocess/sync/shm/named_upgradable_mutex.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -8,8 +8,8 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
-#ifndef BOOST_INTERPROCESS_named_upgradable_mutex_HPP
-#define BOOST_INTERPROCESS_named_upgradable_mutex_HPP
+#ifndef BOOST_INTERPROCESS_NAMED_UPGRADABLE_MUTEX_HPP
+#define BOOST_INTERPROCESS_NAMED_UPGRADABLE_MUTEX_HPP
 
 #if (defined _MSC_VER) && (_MSC_VER >= 1200)
 # pragma once
@@ -369,4 +369,4 @@
 
 #include <boost/interprocess/detail/config_end.hpp>
 
-#endif //BOOST_INTERPROCESS_named_upgradable_mutex_HPP
+#endif //BOOST_INTERPROCESS_NAMED_UPGRADABLE_MUTEX_HPP

Modified: trunk/boost/interprocess/sync/spin/condition.hpp
==============================================================================
--- trunk/boost/interprocess/sync/spin/condition.hpp (original)
+++ trunk/boost/interprocess/sync/spin/condition.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -13,9 +13,9 @@
 
 #include <boost/interprocess/detail/config_begin.hpp>
 #include <boost/interprocess/detail/workaround.hpp>
+#include <boost/interprocess/sync/spin/mutex.hpp>
 #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
 #include <boost/interprocess/detail/atomic.hpp>
-#include <boost/interprocess/sync/spin/mutex.hpp>
 #include <boost/interprocess/sync/scoped_lock.hpp>
 #include <boost/interprocess/exceptions.hpp>
 #include <boost/interprocess/detail/os_thread_functions.hpp>
@@ -94,7 +94,7 @@
    bool do_timed_wait(bool tout_enabled, const boost::posix_time::ptime &abs_time, InterprocessMutex &mut);
 
    enum { SLEEP = 0, NOTIFY_ONE, NOTIFY_ALL };
- ipcdetail::spin_mutex m_enter_mut;
+ spin_mutex m_enter_mut;
    volatile boost::uint32_t m_command;
    volatile boost::uint32_t m_num_waiters;
    void notify(boost::uint32_t command);
@@ -134,19 +134,19 @@
    m_enter_mut.lock();
 
    //Return if there are no waiters
- if(!ipcdetail::atomic_read32(&m_num_waiters)) {
+ if(!atomic_read32(&m_num_waiters)) {
       m_enter_mut.unlock();
       return;
    }
 
    //Notify that all threads should execute wait logic
- while(SLEEP != ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_command), command, SLEEP)){
- ipcdetail::thread_yield();
+ while(SLEEP != atomic_cas32(const_cast<boost::uint32_t*>(&m_command), command, SLEEP)){
+ thread_yield();
    }
 /*
    //Wait until the threads are woken
- while(SLEEP != ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_command), 0)){
- ipcdetail::thread_yield();
+ while(SLEEP != atomic_cas32(const_cast<boost::uint32_t*>(&m_command), 0)){
+ thread_yield();
    }
 */
    //The enter mutex will rest locked until the last waiting thread unlocks it
@@ -176,7 +176,7 @@
       if(now >= abs_time) return false;
    }
 
- typedef boost::interprocess::scoped_lock<ipcdetail::spin_mutex> InternalLock;
+ typedef boost::interprocess::scoped_lock<spin_mutex> InternalLock;
    //The enter mutex guarantees that while executing a notification,
    //no other thread can execute the do_timed_wait method.
    {
@@ -197,7 +197,7 @@
       //We increment the waiting thread count protected so that it will be
       //always constant when another thread enters the notification logic.
       //The increment marks this thread as "waiting on spin_condition"
- ipcdetail::atomic_inc32(const_cast<boost::uint32_t*>(&m_num_waiters));
+ atomic_inc32(const_cast<boost::uint32_t*>(&m_num_waiters));
 
       //We unlock the external mutex atomically with the increment
       mut.unlock();
@@ -211,8 +211,8 @@
    while(1){
       //The thread sleeps/spins until a spin_condition commands a notification
       //Notification occurred, we will lock the checking mutex so that
- while(ipcdetail::atomic_read32(&m_command) == SLEEP){
- ipcdetail::thread_yield();
+ while(atomic_read32(&m_command) == SLEEP){
+ thread_yield();
 
          //Check for timeout
          if(tout_enabled){
@@ -240,12 +240,12 @@
       //If a timeout occurred, the mutex will not execute checking logic
       if(tout_enabled && timed_out){
          //Decrement wait count
- ipcdetail::atomic_dec32(const_cast<boost::uint32_t*>(&m_num_waiters));
+ atomic_dec32(const_cast<boost::uint32_t*>(&m_num_waiters));
          unlock_enter_mut = true;
          break;
       }
       else{
- boost::uint32_t result = ipcdetail::atomic_cas32
+ boost::uint32_t result = atomic_cas32
                         (const_cast<boost::uint32_t*>(&m_command), SLEEP, NOTIFY_ONE);
          if(result == SLEEP){
             //Other thread has been notified and since it was a NOTIFY one
@@ -258,17 +258,17 @@
             //so no other thread will exit.
             //Decrement wait count.
             unlock_enter_mut = true;
- ipcdetail::atomic_dec32(const_cast<boost::uint32_t*>(&m_num_waiters));
+ atomic_dec32(const_cast<boost::uint32_t*>(&m_num_waiters));
             break;
          }
          else{
             //If it is a NOTIFY_ALL command, all threads should return
             //from do_timed_wait function. Decrement wait count.
- unlock_enter_mut = 1 == ipcdetail::atomic_dec32(const_cast<boost::uint32_t*>(&m_num_waiters));
+ unlock_enter_mut = 1 == atomic_dec32(const_cast<boost::uint32_t*>(&m_num_waiters));
             //Check if this is the last thread of notify_all waiters
             //Only the last thread will release the mutex
             if(unlock_enter_mut){
- ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_command), SLEEP, NOTIFY_ALL);
+ atomic_cas32(const_cast<boost::uint32_t*>(&m_command), SLEEP, NOTIFY_ALL);
             }
             break;
          }

Modified: trunk/boost/interprocess/sync/spin/mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/spin/mutex.hpp (original)
+++ trunk/boost/interprocess/sync/spin/mutex.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -86,8 +86,6 @@
    //Obtain current count and target time
    boost::posix_time::ptime now = microsec_clock::universal_time();
 
- if(now >= abs_time) return false;
-
    do{
       if(this->try_lock()){
          break;

Modified: trunk/boost/interprocess/sync/spin/recursive_mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/spin/recursive_mutex.hpp (original)
+++ trunk/boost/interprocess/sync/spin/recursive_mutex.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -163,8 +163,7 @@
    typedef ipcdetail::OS_systemwide_thread_id_t handle_t;
    this->m_nLockCount = 1;
    const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id());
- ipcdetail::systemwide_thread_id_copy
- (thr_id, m_nOwner);
+ ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner);
 }
 
 } //namespace ipcdetail {

Modified: trunk/boost/interprocess/sync/spin/semaphore.hpp
==============================================================================
--- trunk/boost/interprocess/sync/spin/semaphore.hpp (original)
+++ trunk/boost/interprocess/sync/spin/semaphore.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -79,8 +79,6 @@
    }
    //Obtain current count and target time
    boost::posix_time::ptime now(microsec_clock::universal_time());
- if(now >= abs_time)
- return false;
 
    do{
       if(this->try_wait()){

Modified: trunk/boost/interprocess/sync/windows/mutex.hpp
==============================================================================
--- trunk/boost/interprocess/sync/windows/mutex.hpp (original)
+++ trunk/boost/interprocess/sync/windows/mutex.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -104,22 +104,17 @@
    boost::posix_time::ptime now
       = boost::posix_time::microsec_clock::universal_time();
 
- if(abs_time < now){
- return false;
- }
- else{
- unsigned long ms = (unsigned long)(abs_time-now).total_milliseconds();
- sync_handles &handles =
- intermodule_singleton<sync_handles>::get();
- //This can throw
- void *hnd = handles.obtain_mutex(this->id_);
- unsigned long ret = winapi::wait_for_single_object(hnd, ms);
- if(ret == winapi::wait_failed){
- error_info err(winapi::get_last_error());
- throw interprocess_exception(err);
- }
- return ret != winapi::wait_timeout;
+ unsigned long ms = (unsigned long)(abs_time-now).total_milliseconds();
+ sync_handles &handles =
+ intermodule_singleton<sync_handles>::get();
+ //This can throw
+ void *hnd = handles.obtain_mutex(this->id_);
+ unsigned long ret = winapi::wait_for_single_object(hnd, ms);
+ if(ret == winapi::wait_failed){
+ error_info err(winapi::get_last_error());
+ throw interprocess_exception(err);
    }
+ return ret != winapi::wait_timeout;
 }
 
 inline void windows_mutex::unlock(void)

Modified: trunk/boost/interprocess/sync/windows/semaphore.hpp
==============================================================================
--- trunk/boost/interprocess/sync/windows/semaphore.hpp (original)
+++ trunk/boost/interprocess/sync/windows/semaphore.hpp 2011-12-26 06:08:44 EST (Mon, 26 Dec 2011)
@@ -103,22 +103,17 @@
    boost::posix_time::ptime now
       = boost::posix_time::microsec_clock::universal_time();
 
- if(abs_time < now){
- return false;
- }
- else{
- unsigned long ms = (unsigned long)(abs_time-now).total_milliseconds();
- sync_handles &handles =
- intermodule_singleton<sync_handles>::get();
- //This can throw
- void *hnd = handles.obtain_semaphore(this->id_, 0);
- unsigned long ret = winapi::wait_for_single_object(hnd, ms);
- if(ret == winapi::wait_failed){
- error_info err(winapi::get_last_error());
- throw interprocess_exception(err);
- }
- return ret != winapi::wait_timeout;
+ unsigned long ms = (unsigned long)(abs_time-now).total_milliseconds();
+ sync_handles &handles =
+ intermodule_singleton<sync_handles>::get();
+ //This can throw
+ void *hnd = handles.obtain_semaphore(this->id_, 0);
+ unsigned long ret = winapi::wait_for_single_object(hnd, ms);
+ if(ret == winapi::wait_failed){
+ error_info err(winapi::get_last_error());
+ throw interprocess_exception(err);
    }
+ return ret != winapi::wait_timeout;
 }
 
 inline void windows_semaphore::post(long release_count)


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