annotate DEPENDENCIES/generic/include/boost/interprocess/sync/windows/winapi_wrapper_common.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents f46d142149f5
children
rev   line source
Chris@102 1 //////////////////////////////////////////////////////////////////////////////
Chris@102 2 //
Chris@102 3 // (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost
Chris@102 4 // Software License, Version 1.0. (See accompanying file
Chris@102 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@102 6 //
Chris@102 7 // See http://www.boost.org/libs/interprocess for documentation.
Chris@102 8 //
Chris@102 9 //////////////////////////////////////////////////////////////////////////////
Chris@102 10
Chris@102 11 #ifndef BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP
Chris@102 12 #define BOOST_INTERPROCESS_DETAIL_WINAPI_WRAPPER_COMMON_HPP
Chris@102 13
Chris@102 14 #ifndef BOOST_CONFIG_HPP
Chris@102 15 # include <boost/config.hpp>
Chris@102 16 #endif
Chris@102 17 #
Chris@102 18 #if defined(BOOST_HAS_PRAGMA_ONCE)
Chris@102 19 # pragma once
Chris@102 20 #endif
Chris@102 21
Chris@102 22 #include <boost/interprocess/detail/config_begin.hpp>
Chris@102 23 #include <boost/interprocess/detail/workaround.hpp>
Chris@102 24 #include <boost/interprocess/detail/win32_api.hpp>
Chris@102 25 #include <boost/interprocess/detail/posix_time_types_wrk.hpp>
Chris@102 26 #include <boost/interprocess/errors.hpp>
Chris@102 27 #include <boost/interprocess/exceptions.hpp>
Chris@102 28 #include <limits>
Chris@102 29
Chris@102 30 namespace boost {
Chris@102 31 namespace interprocess {
Chris@102 32 namespace ipcdetail {
Chris@102 33
Chris@102 34 inline void winapi_wrapper_wait_for_single_object(void *handle)
Chris@102 35 {
Chris@102 36 unsigned long ret = winapi::wait_for_single_object(handle, winapi::infinite_time);
Chris@102 37 if(ret != winapi::wait_object_0){
Chris@102 38 if(ret != winapi::wait_abandoned){
Chris@102 39 error_info err = system_error_code();
Chris@102 40 throw interprocess_exception(err);
Chris@102 41 }
Chris@102 42 else{ //Special case for orphaned mutexes
Chris@102 43 winapi::release_mutex(handle);
Chris@102 44 throw interprocess_exception(owner_dead_error);
Chris@102 45 }
Chris@102 46 }
Chris@102 47 }
Chris@102 48
Chris@102 49 inline bool winapi_wrapper_try_wait_for_single_object(void *handle)
Chris@102 50 {
Chris@102 51 unsigned long ret = winapi::wait_for_single_object(handle, 0);
Chris@102 52 if(ret == winapi::wait_object_0){
Chris@102 53 return true;
Chris@102 54 }
Chris@102 55 else if(ret == winapi::wait_timeout){
Chris@102 56 return false;
Chris@102 57 }
Chris@102 58 else{
Chris@102 59 error_info err = system_error_code();
Chris@102 60 throw interprocess_exception(err);
Chris@102 61 }
Chris@102 62 }
Chris@102 63
Chris@102 64 inline bool winapi_wrapper_timed_wait_for_single_object(void *handle, const boost::posix_time::ptime &abs_time)
Chris@102 65 {
Chris@102 66 //Windows does not support infinity abs_time so check it
Chris@102 67 if(abs_time == boost::posix_time::pos_infin){
Chris@102 68 winapi_wrapper_wait_for_single_object(handle);
Chris@102 69 return true;
Chris@102 70 }
Chris@102 71 const boost::posix_time::ptime cur_time = microsec_clock::universal_time();
Chris@102 72 //Windows uses relative wait times so check for negative waits
Chris@102 73 //and implement as 0 wait to allow try-semantics as POSIX mandates.
Chris@102 74 unsigned long ret = winapi::wait_for_single_object
Chris@102 75 ( handle
Chris@102 76 , (abs_time <= cur_time) ? 0u
Chris@102 77 : (abs_time - cur_time).total_milliseconds()
Chris@102 78 );
Chris@102 79 if(ret == winapi::wait_object_0){
Chris@102 80 return true;
Chris@102 81 }
Chris@102 82 else if(ret == winapi::wait_timeout){
Chris@102 83 return false;
Chris@102 84 }
Chris@102 85 else{
Chris@102 86 error_info err = system_error_code();
Chris@102 87 throw interprocess_exception(err);
Chris@102 88 }
Chris@102 89 }
Chris@102 90
Chris@102 91 } //namespace ipcdetail {
Chris@102 92 } //namespace interprocess {
Chris@102 93 } //namespace boost {
Chris@102 94
Chris@102 95 #include <boost/interprocess/detail/config_end.hpp>
Chris@102 96
Chris@102 97 #endif //BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP