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
184 # include <windows.h>
189 # define __VOLATILE volatile
196 CRITICAL_SECTION _M_mtx_impl;
197 # if _FAST_MUTEX_CHECK_INITIALIZATION
209 ::InitializeCriticalSection(&_M_mtx_impl);
210 # if _FAST_MUTEX_CHECK_INITIALIZATION
211 _M_initialized =
true;
216 _FAST_MUTEX_ASSERT(!_M_locked,
"~fast_mutex(): still locked");
217 # if _FAST_MUTEX_CHECK_INITIALIZATION
218 _M_initialized =
false;
220 ::DeleteCriticalSection(&_M_mtx_impl);
224 # if _FAST_MUTEX_CHECK_INITIALIZATION
228 ::EnterCriticalSection(&_M_mtx_impl);
230 _FAST_MUTEX_ASSERT(!_M_locked,
"lock(): already locked");
236 # if _FAST_MUTEX_CHECK_INITIALIZATION
241 _FAST_MUTEX_ASSERT(_M_locked,
"unlock(): not locked");
244 ::LeaveCriticalSection(&_M_mtx_impl);
247 fast_mutex(
const fast_mutex&);
248 fast_mutex& operator=(
const fast_mutex&);
250 # endif // _WIN32THREADS
276 _FAST_MUTEX_ASSERT(!_M_locked,
"~fast_mutex(): still locked");
281 _FAST_MUTEX_ASSERT(!_M_locked,
"lock(): already locked");
288 _FAST_MUTEX_ASSERT(_M_locked,
"unlock(): not locked");
293 fast_mutex(
const fast_mutex&);
294 fast_mutex& operator=(
const fast_mutex&);
296 # endif // _NOTHREADS
299 class fast_mutex_autolock
303 explicit fast_mutex_autolock(fast_mutex& __mtx) : _M_mtx(__mtx)
307 ~fast_mutex_autolock()
312 fast_mutex_autolock(
const fast_mutex_autolock&);
313 fast_mutex_autolock& operator=(
const fast_mutex_autolock&);
316 #endif // _FAST_MUTEX_H