diff options
Diffstat (limited to 'boost/interprocess/sync/windows/winapi_wrapper_common.hpp')
-rw-r--r-- | boost/interprocess/sync/windows/winapi_wrapper_common.hpp | 51 |
1 files changed, 18 insertions, 33 deletions
diff --git a/boost/interprocess/sync/windows/winapi_wrapper_common.hpp b/boost/interprocess/sync/windows/winapi_wrapper_common.hpp index 428a26eb66..0bc6a2d903 100644 --- a/boost/interprocess/sync/windows/winapi_wrapper_common.hpp +++ b/boost/interprocess/sync/windows/winapi_wrapper_common.hpp @@ -31,57 +31,42 @@ namespace boost { namespace interprocess { namespace ipcdetail { +inline bool winapi_wrapper_timed_wait_for_single_object(void *handle, const boost::posix_time::ptime &abs_time); + inline void winapi_wrapper_wait_for_single_object(void *handle) { - unsigned long ret = winapi::wait_for_single_object(handle, 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{ //Special case for orphaned mutexes - winapi::release_mutex(handle); - throw interprocess_exception(owner_dead_error); - } - } + winapi_wrapper_timed_wait_for_single_object(handle, boost::posix_time::pos_infin); } 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); - } + return winapi_wrapper_timed_wait_for_single_object(handle, boost::posix_time::min_date_time); } 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() - ); + unsigned long time = 0u; + if (abs_time == boost::posix_time::pos_infin){ + time = winapi::infinite_time; + } + else if(abs_time > cur_time){ + time = (abs_time - cur_time).total_milliseconds(); + } + + unsigned long ret = winapi::wait_for_single_object(handle, time); if(ret == winapi::wait_object_0){ return true; } else if(ret == winapi::wait_timeout){ return false; } + else if(ret == winapi::wait_abandoned){ //Special case for orphaned mutexes + winapi::release_mutex(handle); + throw interprocess_exception(owner_dead_error); + } else{ error_info err = system_error_code(); throw interprocess_exception(err); @@ -94,4 +79,4 @@ inline bool winapi_wrapper_timed_wait_for_single_object(void *handle, const boos #include <boost/interprocess/detail/config_end.hpp> -#endif //BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP +#endif //BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP |