Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // (C) Copyright Ion Gaztanaga 2011-2012. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // See http://www.boost.org/libs/interprocess for documentation. Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: #ifndef BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP Chris@16: #define BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP Chris@16: Chris@101: #ifndef BOOST_CONFIG_HPP Chris@101: # include Chris@101: #endif Chris@101: # Chris@101: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace interprocess { Chris@16: namespace ipcdetail { Chris@16: Chris@16: class winapi_mutex_functions Chris@16: { Chris@101: #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) Chris@16: Chris@16: //Non-copyable Chris@16: winapi_mutex_functions(const winapi_mutex_functions &); Chris@16: winapi_mutex_functions &operator=(const winapi_mutex_functions &); Chris@101: #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED Chris@16: Chris@16: public: Chris@16: winapi_mutex_functions(void *mtx_hnd) Chris@16: : m_mtx_hnd(mtx_hnd) Chris@16: {} Chris@16: Chris@16: void unlock() Chris@101: { winapi::release_mutex(m_mtx_hnd); } Chris@16: Chris@16: void lock() Chris@101: { return winapi_wrapper_wait_for_single_object(m_mtx_hnd); } Chris@16: Chris@16: bool try_lock() Chris@101: { return winapi_wrapper_try_wait_for_single_object(m_mtx_hnd); } Chris@16: Chris@16: bool timed_lock(const boost::posix_time::ptime &abs_time) Chris@101: { return winapi_wrapper_timed_wait_for_single_object(m_mtx_hnd, abs_time); } Chris@16: Chris@101: #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) Chris@16: protected: Chris@16: void *m_mtx_hnd; Chris@101: #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED Chris@16: }; Chris@16: Chris@16: //Swappable mutex wrapper Chris@16: class winapi_mutex_wrapper Chris@16: : public winapi_mutex_functions Chris@16: { Chris@101: #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) Chris@16: Chris@16: //Non-copyable Chris@16: winapi_mutex_wrapper(const winapi_mutex_wrapper &); Chris@16: winapi_mutex_wrapper &operator=(const winapi_mutex_wrapper &); Chris@101: #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED Chris@101: Chris@101: //Note that Windows API does not return winapi::invalid_handle_value Chris@101: //when failing to create/open a mutex, but a nullptr Chris@16: Chris@16: public: Chris@101: winapi_mutex_wrapper(void *mtx_hnd = 0) Chris@16: : winapi_mutex_functions(mtx_hnd) Chris@16: {} Chris@16: Chris@16: ~winapi_mutex_wrapper() Chris@16: { this->close(); } Chris@16: Chris@16: void *release() Chris@16: { Chris@16: void *hnd = m_mtx_hnd; Chris@101: m_mtx_hnd = 0; Chris@16: return hnd; Chris@16: } Chris@16: Chris@16: void *handle() const Chris@16: { return m_mtx_hnd; } Chris@16: Chris@16: bool open_or_create(const char *name, const permissions &perm) Chris@16: { Chris@101: if(m_mtx_hnd == 0){ Chris@16: m_mtx_hnd = winapi::open_or_create_mutex Chris@16: ( name Chris@16: , false Chris@16: , (winapi::interprocess_security_attributes*)perm.get_permissions() Chris@16: ); Chris@101: return m_mtx_hnd != 0; Chris@16: } Chris@16: else{ Chris@16: return false; Chris@16: } Chris@101: } Chris@16: Chris@16: void close() Chris@16: { Chris@101: if(m_mtx_hnd != 0){ Chris@16: winapi::close_handle(m_mtx_hnd); Chris@101: m_mtx_hnd = 0; Chris@16: } Chris@16: } Chris@16: Chris@16: void swap(winapi_mutex_wrapper &other) Chris@16: { void *tmp = m_mtx_hnd; m_mtx_hnd = other.m_mtx_hnd; other.m_mtx_hnd = tmp; } Chris@16: }; Chris@16: Chris@16: } //namespace ipcdetail { Chris@16: } //namespace interprocess { Chris@16: } //namespace boost { Chris@16: Chris@16: #include Chris@16: Chris@16: #endif //BOOST_INTERPROCESS_DETAIL_WINAPI_MUTEX_WRAPPER_HPP