sl@0: // Copyright (C) 2000 Stephen Cleary sl@0: // sl@0: // Distributed under the Boost Software License, Version 1.0. (See sl@0: // accompanying file LICENSE_1_0.txt or copy at sl@0: // http://www.boost.org/LICENSE_1_0.txt) sl@0: // sl@0: // See http://www.boost.org for updates, documentation, and revision history. sl@0: sl@0: #ifndef BOOST_POOL_MUTEX_HPP sl@0: #define BOOST_POOL_MUTEX_HPP sl@0: sl@0: #include // for workarounds sl@0: sl@0: // Extremely Light-Weight wrapper classes for OS thread synchronization sl@0: sl@0: // Configuration: for now, we just choose between pthread or Win32 mutexes or none sl@0: sl@0: #define BOOST_MUTEX_HELPER_NONE 0 sl@0: #define BOOST_MUTEX_HELPER_WIN32 1 sl@0: #define BOOST_MUTEX_HELPER_PTHREAD 2 sl@0: sl@0: #if !defined(BOOST_HAS_THREADS) && !defined(BOOST_NO_MT) sl@0: # define BOOST_NO_MT sl@0: #endif sl@0: sl@0: #ifdef BOOST_NO_MT sl@0: // No multithreading -> make locks into no-ops sl@0: #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_NONE sl@0: #else sl@0: #ifdef BOOST_WINDOWS sl@0: #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_WIN32 sl@0: #else sl@0: #include sl@0: #ifdef _POSIX_THREADS sl@0: #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_PTHREAD sl@0: #endif sl@0: #endif sl@0: #endif sl@0: sl@0: #ifndef BOOST_MUTEX_HELPER sl@0: #error Unable to determine platform mutex type; define BOOST_NO_MT to assume single-threaded sl@0: #endif sl@0: sl@0: #ifndef BOOST_NO_MT sl@0: # ifdef BOOST_WINDOWS sl@0: # include sl@0: # endif sl@0: # ifdef _POSIX_THREADS sl@0: # include sl@0: # endif sl@0: #endif sl@0: sl@0: namespace boost { sl@0: sl@0: namespace details { sl@0: namespace pool { sl@0: sl@0: #ifndef BOOST_NO_MT sl@0: sl@0: #ifdef BOOST_WINDOWS sl@0: sl@0: class win32_mutex sl@0: { sl@0: private: sl@0: CRITICAL_SECTION mtx; sl@0: sl@0: win32_mutex(const win32_mutex &); sl@0: void operator=(const win32_mutex &); sl@0: sl@0: public: sl@0: win32_mutex() sl@0: { InitializeCriticalSection(&mtx); } sl@0: sl@0: ~win32_mutex() sl@0: { DeleteCriticalSection(&mtx); } sl@0: sl@0: void lock() sl@0: { EnterCriticalSection(&mtx); } sl@0: sl@0: void unlock() sl@0: { LeaveCriticalSection(&mtx); } sl@0: }; sl@0: sl@0: #endif // defined(BOOST_WINDOWS) sl@0: sl@0: #ifdef _POSIX_THREADS sl@0: sl@0: class pthread_mutex sl@0: { sl@0: private: sl@0: pthread_mutex_t mtx; sl@0: sl@0: pthread_mutex(const pthread_mutex &); sl@0: void operator=(const pthread_mutex &); sl@0: sl@0: public: sl@0: pthread_mutex() sl@0: { pthread_mutex_init(&mtx, 0); } sl@0: sl@0: ~pthread_mutex() sl@0: { pthread_mutex_destroy(&mtx); } sl@0: sl@0: void lock() sl@0: { pthread_mutex_lock(&mtx); } sl@0: sl@0: void unlock() sl@0: { pthread_mutex_unlock(&mtx); } sl@0: }; sl@0: sl@0: #endif // defined(_POSIX_THREADS) sl@0: sl@0: #endif // !defined(BOOST_NO_MT) sl@0: sl@0: class null_mutex sl@0: { sl@0: private: sl@0: null_mutex(const null_mutex &); sl@0: void operator=(const null_mutex &); sl@0: sl@0: public: sl@0: null_mutex() { } sl@0: sl@0: static void lock() { } sl@0: static void unlock() { } sl@0: }; sl@0: sl@0: #if BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_NONE sl@0: typedef null_mutex default_mutex; sl@0: #elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_WIN32 sl@0: typedef win32_mutex default_mutex; sl@0: #elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_PTHREAD sl@0: typedef pthread_mutex default_mutex; sl@0: #endif sl@0: sl@0: } // namespace pool sl@0: } // namespace details sl@0: sl@0: } // namespace boost sl@0: sl@0: #undef BOOST_MUTEX_HELPER_WIN32 sl@0: #undef BOOST_MUTEX_HELPER_PTHREAD sl@0: #undef BOOST_MUTEX_HELPER_NONE sl@0: #undef BOOST_MUTEX_HELPER sl@0: sl@0: #endif