8 #ifdef CHECK_MEMORY_LEAKS
47 # if !defined(_NOTHREADS)
48 # if !defined(_WIN32THREADS) && \
49 (defined(_WIN32) && defined(_MT))
52 # define _WIN32THREADS
53 # elif !defined(_PTHREADS) && \
62 # if !defined(_PTHREADS) && !defined(_WIN32THREADS) && !defined(_NOTHREADS)
66 # if defined(_NOTHREADS)
67 # if defined(_PTHREADS) || defined(_WIN32THREADS)
69 # error "Cannot define multi-threaded mode with -D_NOTHREADS"
70 # if defined(__MINGW32__) && defined(_WIN32THREADS) && !defined(_MT)
71 # error "Be sure to specify -mthreads with -D_WIN32THREADS"
76 # ifndef _FAST_MUTEX_CHECK_INITIALIZATION
85 # define _FAST_MUTEX_CHECK_INITIALIZATION 1
88 # if defined(_PTHREADS) && defined(_WIN32THREADS)
98 # define _FAST_MUTEX_ASSERT(_Expr, _Msg) \
100 fprintf(stderr, "fast_mutex::%s\n", _Msg); \
105 # define _FAST_MUTEX_ASSERT(_Expr, _Msg) \
110 # include <pthread.h>
115 # define __VOLATILE volatile
122 pthread_mutex_t _M_mtx_impl;
123 # if _FAST_MUTEX_CHECK_INITIALIZATION
135 ::pthread_mutex_init(&_M_mtx_impl, NULL);
136 # if _FAST_MUTEX_CHECK_INITIALIZATION
137 _M_initialized =
true;
142 _FAST_MUTEX_ASSERT(!_M_locked,
"~fast_mutex(): still locked");
143 # if _FAST_MUTEX_CHECK_INITIALIZATION
144 _M_initialized =
false;
146 ::pthread_mutex_destroy(&_M_mtx_impl);
150 # if _FAST_MUTEX_CHECK_INITIALIZATION
154 ::pthread_mutex_lock(&_M_mtx_impl);
161 _FAST_MUTEX_ASSERT(!_M_locked,
"lock(): already locked");
167 # if _FAST_MUTEX_CHECK_INITIALIZATION
172 _FAST_MUTEX_ASSERT(_M_locked,
"unlock(): not locked");
175 ::pthread_mutex_unlock(&_M_mtx_impl);
178 fast_mutex(
const fast_mutex&);
179 fast_mutex& operator=(
const fast_mutex&);
183 # ifdef _WIN32THREADS
185 # include <windows.h>
191 # define __VOLATILE volatile
198 CRITICAL_SECTION _M_mtx_impl;
199 # if _FAST_MUTEX_CHECK_INITIALIZATION
211 ::InitializeCriticalSection(&_M_mtx_impl);
212 # if _FAST_MUTEX_CHECK_INITIALIZATION
213 _M_initialized =
true;
218 _FAST_MUTEX_ASSERT(!_M_locked,
"~fast_mutex(): still locked");
219 # if _FAST_MUTEX_CHECK_INITIALIZATION
220 _M_initialized =
false;
222 ::DeleteCriticalSection(&_M_mtx_impl);
226 # if _FAST_MUTEX_CHECK_INITIALIZATION
230 ::EnterCriticalSection(&_M_mtx_impl);
232 _FAST_MUTEX_ASSERT(!_M_locked,
"lock(): already locked");
238 # if _FAST_MUTEX_CHECK_INITIALIZATION
243 _FAST_MUTEX_ASSERT(_M_locked,
"unlock(): not locked");
246 ::LeaveCriticalSection(&_M_mtx_impl);
249 fast_mutex(
const fast_mutex&);
250 fast_mutex& operator=(
const fast_mutex&);
252 # endif // _WIN32THREADS
278 _FAST_MUTEX_ASSERT(!_M_locked,
"~fast_mutex(): still locked");
283 _FAST_MUTEX_ASSERT(!_M_locked,
"lock(): already locked");
290 _FAST_MUTEX_ASSERT(_M_locked,
"unlock(): not locked");
295 fast_mutex(
const fast_mutex&);
296 fast_mutex& operator=(
const fast_mutex&);
298 # endif // _NOTHREADS
301 class fast_mutex_autolock
305 explicit fast_mutex_autolock(fast_mutex& __mtx) : _M_mtx(__mtx)
309 ~fast_mutex_autolock()
314 fast_mutex_autolock(
const fast_mutex_autolock&);
315 fast_mutex_autolock& operator=(
const fast_mutex_autolock&);
318 #endif // _FAST_MUTEX_H