Chris@16: /* Chris@101: * Copyright Andrey Semashev 2007 - 2015. Chris@16: * Distributed under the Boost Software License, Version 1.0. Chris@16: * (See accompanying file LICENSE_1_0.txt or copy at Chris@16: * http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: /*! Chris@16: * \file light_rw_mutex.hpp Chris@16: * \author Andrey Semashev Chris@16: * \date 24.03.2009 Chris@16: * Chris@16: * \brief This header is the Boost.Log library implementation, see the library documentation Chris@16: * at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html. Chris@16: */ Chris@16: Chris@16: #ifndef BOOST_LOG_DETAIL_LIGHT_RW_MUTEX_HPP_INCLUDED_ Chris@16: #define BOOST_LOG_DETAIL_LIGHT_RW_MUTEX_HPP_INCLUDED_ Chris@16: Chris@16: #include Chris@16: Chris@16: #ifdef BOOST_HAS_PRAGMA_ONCE Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_LOG_NO_THREADS Chris@16: Chris@16: #include Chris@16: Chris@16: #if defined(BOOST_THREAD_POSIX) // This one can be defined by users, so it should go first Chris@16: #define BOOST_LOG_LWRWMUTEX_USE_PTHREAD Chris@16: #elif defined(BOOST_WINDOWS) && defined(BOOST_LOG_USE_WINNT6_API) Chris@16: #define BOOST_LOG_LWRWMUTEX_USE_SRWLOCK Chris@16: #elif defined(BOOST_HAS_PTHREADS) Chris@16: #define BOOST_LOG_LWRWMUTEX_USE_PTHREAD Chris@16: #endif Chris@16: Chris@16: #if defined(BOOST_LOG_LWRWMUTEX_USE_SRWLOCK) Chris@16: Chris@16: #if defined(BOOST_USE_WINDOWS_H) Chris@16: Chris@16: #ifndef _WIN32_WINNT Chris@16: #define _WIN32_WINNT 0x0600 // _WIN32_WINNT_LONGHORN Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: #else // defined(BOOST_USE_WINDOWS_H) Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: BOOST_LOG_OPEN_NAMESPACE Chris@16: Chris@16: namespace aux { Chris@16: Chris@16: extern "C" { Chris@16: Chris@16: struct SRWLOCK { void* p; }; Chris@16: __declspec(dllimport) void __stdcall InitializeSRWLock(SRWLOCK*); Chris@16: __declspec(dllimport) void __stdcall ReleaseSRWLockExclusive(SRWLOCK*); Chris@16: __declspec(dllimport) void __stdcall ReleaseSRWLockShared(SRWLOCK*); Chris@16: __declspec(dllimport) void __stdcall AcquireSRWLockExclusive(SRWLOCK*); Chris@16: __declspec(dllimport) void __stdcall AcquireSRWLockShared(SRWLOCK*); Chris@16: Chris@16: } // extern "C" Chris@16: Chris@16: } // namespace aux Chris@16: Chris@16: BOOST_LOG_CLOSE_NAMESPACE // namespace log Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_USE_WINDOWS_H Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: BOOST_LOG_OPEN_NAMESPACE Chris@16: Chris@16: namespace aux { Chris@16: Chris@16: //! A light read/write mutex that uses WinNT 6 and later APIs Chris@16: class light_rw_mutex Chris@16: { Chris@16: SRWLOCK m_Mutex; Chris@16: Chris@16: public: Chris@16: light_rw_mutex() Chris@16: { Chris@16: InitializeSRWLock(&m_Mutex); Chris@16: } Chris@16: void lock_shared() Chris@16: { Chris@16: AcquireSRWLockShared(&m_Mutex); Chris@16: } Chris@16: void unlock_shared() Chris@16: { Chris@16: ReleaseSRWLockShared(&m_Mutex); Chris@16: } Chris@16: void lock() Chris@16: { Chris@16: AcquireSRWLockExclusive(&m_Mutex); Chris@16: } Chris@16: void unlock() Chris@16: { Chris@16: ReleaseSRWLockExclusive(&m_Mutex); Chris@16: } Chris@16: Chris@16: // Noncopyable Chris@16: BOOST_DELETED_FUNCTION(light_rw_mutex(light_rw_mutex const&)) Chris@16: BOOST_DELETED_FUNCTION(light_rw_mutex& operator= (light_rw_mutex const&)) Chris@16: }; Chris@16: Chris@16: } // namespace aux Chris@16: Chris@16: BOOST_LOG_CLOSE_NAMESPACE // namespace log Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #elif defined(BOOST_LOG_LWRWMUTEX_USE_PTHREAD) Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: BOOST_LOG_OPEN_NAMESPACE Chris@16: Chris@16: namespace aux { Chris@16: Chris@16: //! A light read/write mutex that maps directly onto POSIX threading library Chris@16: class light_rw_mutex Chris@16: { Chris@16: pthread_rwlock_t m_Mutex; Chris@16: Chris@16: public: Chris@16: light_rw_mutex() Chris@16: { Chris@16: pthread_rwlock_init(&m_Mutex, NULL); Chris@16: } Chris@16: ~light_rw_mutex() Chris@16: { Chris@16: pthread_rwlock_destroy(&m_Mutex); Chris@16: } Chris@16: void lock_shared() Chris@16: { Chris@16: pthread_rwlock_rdlock(&m_Mutex); Chris@16: } Chris@16: void unlock_shared() Chris@16: { Chris@16: pthread_rwlock_unlock(&m_Mutex); Chris@16: } Chris@16: void lock() Chris@16: { Chris@16: pthread_rwlock_wrlock(&m_Mutex); Chris@16: } Chris@16: void unlock() Chris@16: { Chris@16: pthread_rwlock_unlock(&m_Mutex); Chris@16: } Chris@16: Chris@16: // Noncopyable Chris@16: BOOST_DELETED_FUNCTION(light_rw_mutex(light_rw_mutex const&)) Chris@16: BOOST_DELETED_FUNCTION(light_rw_mutex& operator= (light_rw_mutex const&)) Chris@16: }; Chris@16: Chris@16: } // namespace aux Chris@16: Chris@16: BOOST_LOG_CLOSE_NAMESPACE // namespace log Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #else Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: BOOST_LOG_OPEN_NAMESPACE Chris@16: Chris@16: namespace aux { Chris@16: Chris@16: //! A light read/write mutex Chris@16: class light_rw_mutex Chris@16: { Chris@16: struct { void* p; } m_Mutex; Chris@16: Chris@16: public: Chris@16: BOOST_LOG_API light_rw_mutex(); Chris@16: BOOST_LOG_API ~light_rw_mutex(); Chris@16: BOOST_LOG_API void lock_shared(); Chris@16: BOOST_LOG_API void unlock_shared(); Chris@16: BOOST_LOG_API void lock(); Chris@16: BOOST_LOG_API void unlock(); Chris@16: Chris@16: // Noncopyable Chris@16: BOOST_DELETED_FUNCTION(light_rw_mutex(light_rw_mutex const&)) Chris@16: BOOST_DELETED_FUNCTION(light_rw_mutex& operator= (light_rw_mutex const&)) Chris@16: }; Chris@16: Chris@16: } // namespace aux Chris@16: Chris@16: BOOST_LOG_CLOSE_NAMESPACE // namespace log Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_LOG_NO_THREADS Chris@16: Chris@16: #endif // BOOST_LOG_DETAIL_LIGHT_RW_MUTEX_HPP_INCLUDED_