Chris@102: ////////////////////////////////////////////////////////////////////////////// Chris@102: // Chris@102: // (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost Chris@102: // Software License, Version 1.0. (See accompanying file Chris@102: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // See http://www.boost.org/libs/interprocess for documentation. Chris@102: // Chris@102: ////////////////////////////////////////////////////////////////////////////// Chris@102: Chris@102: #ifndef BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP Chris@102: #define BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP Chris@102: Chris@102: #ifndef BOOST_CONFIG_HPP Chris@102: # include Chris@102: #endif Chris@102: # Chris@102: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { Chris@102: namespace interprocess { Chris@102: namespace ipcdetail { Chris@102: Chris@102: inline void winapi_wrapper_wait_for_single_object(void *handle) Chris@102: { Chris@102: unsigned long ret = winapi::wait_for_single_object(handle, winapi::infinite_time); Chris@102: if(ret != winapi::wait_object_0){ Chris@102: if(ret != winapi::wait_abandoned){ Chris@102: error_info err = system_error_code(); Chris@102: throw interprocess_exception(err); Chris@102: } Chris@102: else{ //Special case for orphaned mutexes Chris@102: winapi::release_mutex(handle); Chris@102: throw interprocess_exception(owner_dead_error); Chris@102: } Chris@102: } Chris@102: } Chris@102: Chris@102: inline bool winapi_wrapper_try_wait_for_single_object(void *handle) Chris@102: { Chris@102: unsigned long ret = winapi::wait_for_single_object(handle, 0); Chris@102: if(ret == winapi::wait_object_0){ Chris@102: return true; Chris@102: } Chris@102: else if(ret == winapi::wait_timeout){ Chris@102: return false; Chris@102: } Chris@102: else{ Chris@102: error_info err = system_error_code(); Chris@102: throw interprocess_exception(err); Chris@102: } Chris@102: } Chris@102: Chris@102: inline bool winapi_wrapper_timed_wait_for_single_object(void *handle, const boost::posix_time::ptime &abs_time) Chris@102: { Chris@102: //Windows does not support infinity abs_time so check it Chris@102: if(abs_time == boost::posix_time::pos_infin){ Chris@102: winapi_wrapper_wait_for_single_object(handle); Chris@102: return true; Chris@102: } Chris@102: const boost::posix_time::ptime cur_time = microsec_clock::universal_time(); Chris@102: //Windows uses relative wait times so check for negative waits Chris@102: //and implement as 0 wait to allow try-semantics as POSIX mandates. Chris@102: unsigned long ret = winapi::wait_for_single_object Chris@102: ( handle Chris@102: , (abs_time <= cur_time) ? 0u Chris@102: : (abs_time - cur_time).total_milliseconds() Chris@102: ); Chris@102: if(ret == winapi::wait_object_0){ Chris@102: return true; Chris@102: } Chris@102: else if(ret == winapi::wait_timeout){ Chris@102: return false; Chris@102: } Chris@102: else{ Chris@102: error_info err = system_error_code(); Chris@102: throw interprocess_exception(err); Chris@102: } Chris@102: } Chris@102: Chris@102: } //namespace ipcdetail { Chris@102: } //namespace interprocess { Chris@102: } //namespace boost { Chris@102: Chris@102: #include Chris@102: Chris@102: #endif //BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP