1 // Copyright (C) 2000 Stephen Cleary
\r
3 // Distributed under the Boost Software License, Version 1.0. (See
\r
4 // accompanying file LICENSE_1_0.txt or copy at
\r
5 // http://www.boost.org/LICENSE_1_0.txt)
\r
7 // See http://www.boost.org for updates, documentation, and revision history.
\r
9 #ifndef BOOST_POOL_MUTEX_HPP
\r
10 #define BOOST_POOL_MUTEX_HPP
\r
12 #include <boost/config.hpp> // for workarounds
\r
14 // Extremely Light-Weight wrapper classes for OS thread synchronization
\r
16 // Configuration: for now, we just choose between pthread or Win32 mutexes or none
\r
18 #define BOOST_MUTEX_HELPER_NONE 0
\r
19 #define BOOST_MUTEX_HELPER_WIN32 1
\r
20 #define BOOST_MUTEX_HELPER_PTHREAD 2
\r
22 #if !defined(BOOST_HAS_THREADS) && !defined(BOOST_NO_MT)
\r
23 # define BOOST_NO_MT
\r
27 // No multithreading -> make locks into no-ops
\r
28 #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_NONE
\r
30 #ifdef BOOST_WINDOWS
\r
31 #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_WIN32
\r
34 #ifdef _POSIX_THREADS
\r
35 #define BOOST_MUTEX_HELPER BOOST_MUTEX_HELPER_PTHREAD
\r
40 #ifndef BOOST_MUTEX_HELPER
\r
41 #error Unable to determine platform mutex type; define BOOST_NO_MT to assume single-threaded
\r
45 # ifdef BOOST_WINDOWS
\r
46 # include <windows.h>
\r
48 # ifdef _POSIX_THREADS
\r
49 # include <pthread.h>
\r
60 #ifdef BOOST_WINDOWS
\r
65 CRITICAL_SECTION mtx;
\r
67 win32_mutex(const win32_mutex &);
\r
68 void operator=(const win32_mutex &);
\r
72 { InitializeCriticalSection(&mtx); }
\r
75 { DeleteCriticalSection(&mtx); }
\r
78 { EnterCriticalSection(&mtx); }
\r
81 { LeaveCriticalSection(&mtx); }
\r
84 #endif // defined(BOOST_WINDOWS)
\r
86 #ifdef _POSIX_THREADS
\r
91 pthread_mutex_t mtx;
\r
93 pthread_mutex(const pthread_mutex &);
\r
94 void operator=(const pthread_mutex &);
\r
98 { pthread_mutex_init(&mtx, 0); }
\r
101 { pthread_mutex_destroy(&mtx); }
\r
104 { pthread_mutex_lock(&mtx); }
\r
107 { pthread_mutex_unlock(&mtx); }
\r
110 #endif // defined(_POSIX_THREADS)
\r
112 #endif // !defined(BOOST_NO_MT)
\r
117 null_mutex(const null_mutex &);
\r
118 void operator=(const null_mutex &);
\r
123 static void lock() { }
\r
124 static void unlock() { }
\r
127 #if BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_NONE
\r
128 typedef null_mutex default_mutex;
\r
129 #elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_WIN32
\r
130 typedef win32_mutex default_mutex;
\r
131 #elif BOOST_MUTEX_HELPER == BOOST_MUTEX_HELPER_PTHREAD
\r
132 typedef pthread_mutex default_mutex;
\r
135 } // namespace pool
\r
136 } // namespace details
\r
138 } // namespace boost
\r
140 #undef BOOST_MUTEX_HELPER_WIN32
\r
141 #undef BOOST_MUTEX_HELPER_PTHREAD
\r
142 #undef BOOST_MUTEX_HELPER_NONE
\r
143 #undef BOOST_MUTEX_HELPER
\r