%PDF- %PDF-
Direktori : /backups/router/usr/local/include/boost/interprocess/sync/windows/ |
Current File : //backups/router/usr/local/include/boost/interprocess/sync/windows/mutex.hpp |
////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2005-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_WINDOWS_MUTEX_HPP #define BOOST_INTERPROCESS_DETAIL_WINDOWS_MUTEX_HPP #ifndef BOOST_CONFIG_HPP # include <boost/config.hpp> #endif # #if defined(BOOST_HAS_PRAGMA_ONCE) # 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/windows_intermodule_singleton.hpp> #include <boost/interprocess/sync/windows/sync_utils.hpp> #include <boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp> #include <boost/interprocess/exceptions.hpp> #include <boost/interprocess/timed_utils.hpp> namespace boost { namespace interprocess { namespace ipcdetail { class winapi_mutex { winapi_mutex(const winapi_mutex &); winapi_mutex &operator=(const winapi_mutex &); public: winapi_mutex(); ~winapi_mutex(); void lock(); bool try_lock(); template<class TimePoint> bool timed_lock(const TimePoint &abs_time); template<class TimePoint> bool try_lock_until(const TimePoint &abs_time) { return this->timed_lock(abs_time); } template<class Duration> bool try_lock_for(const Duration &dur) { return this->timed_lock(duration_to_ustime(dur)); } void unlock(); void take_ownership(){}; private: const sync_id id_; }; inline winapi_mutex::winapi_mutex() : id_() { sync_handles &handles = windows_intermodule_singleton<sync_handles>::get(); //Create mutex with the initial count bool open_or_created; (void)handles.obtain_mutex(this->id_, this, &open_or_created); //The mutex must be created, never opened BOOST_ASSERT(open_or_created); BOOST_ASSERT(open_or_created && winapi::get_last_error() != winapi::error_already_exists); (void)open_or_created; } inline winapi_mutex::~winapi_mutex() { sync_handles &handles = windows_intermodule_singleton<sync_handles>::get(); handles.destroy_handle(this->id_, this); } inline void winapi_mutex::lock(void) { sync_handles &handles = windows_intermodule_singleton<sync_handles>::get(); //This can throw winapi_mutex_functions mut(handles.obtain_mutex(this->id_, this)); mut.lock(); } inline bool winapi_mutex::try_lock(void) { sync_handles &handles = windows_intermodule_singleton<sync_handles>::get(); //This can throw winapi_mutex_functions mut(handles.obtain_mutex(this->id_, this)); return mut.try_lock(); } template<class TimePoint> inline bool winapi_mutex::timed_lock(const TimePoint &abs_time) { sync_handles &handles = windows_intermodule_singleton<sync_handles>::get(); //This can throw winapi_mutex_functions mut(handles.obtain_mutex(this->id_, this)); return mut.timed_lock(abs_time); } inline void winapi_mutex::unlock(void) { sync_handles &handles = windows_intermodule_singleton<sync_handles>::get(); //This can throw winapi_mutex_functions mut(handles.obtain_mutex(this->id_, this)); return mut.unlock(); } } //namespace ipcdetail { } //namespace interprocess { } //namespace boost { #include <boost/interprocess/detail/config_end.hpp> #endif //BOOST_INTERPROCESS_DETAIL_WINDOWS_MUTEX_HPP