37 #ifndef NVWA_FAST_MUTEX_H
38 #define NVWA_FAST_MUTEX_H
43 # if !defined(_NOTHREADS)
44 # if !defined(NVWA_USE_CXX11_MUTEX) && HAVE_CXX11_MUTEX != 0 && \
45 !defined(_WIN32THREADS) && defined(_WIN32) && defined(_MT) && \
46 (!defined(_MSC_VER) || defined(_DLL))
56 # define NVWA_USE_CXX11_MUTEX 1
59 # if !defined(_WIN32THREADS) && \
60 (defined(_WIN32) && defined(_MT))
63 # define _WIN32THREADS
64 # elif !defined(_PTHREADS) && \
71 # ifndef NVWA_USE_CXX11_MUTEX
72 # define NVWA_USE_CXX11_MUTEX 0
75 # if !defined(_PTHREADS) && !defined(_WIN32THREADS) && \
76 !defined(_NOTHREADS) && NVWA_USE_CXX11_MUTEX == 0
80 # if defined(_NOTHREADS)
81 # if defined(_PTHREADS) || defined(_WIN32THREADS) || \
82 NVWA_USE_CXX11_MUTEX != 0
84 # error "Cannot define multi-threaded mode with -D_NOTHREADS"
88 # if defined(__MINGW32__) && defined(_WIN32THREADS) && !defined(_MT)
89 # error "Be sure to specify -mthreads with -D_WIN32THREADS"
92 # ifndef _FAST_MUTEX_CHECK_INITIALIZATION
101 # define _FAST_MUTEX_CHECK_INITIALIZATION 1
104 # if defined(_PTHREADS) && defined(_WIN32THREADS)
114 # define _FAST_MUTEX_ASSERT(_Expr, _Msg) \
116 fprintf(stderr, "fast_mutex::%s\n", _Msg); \
121 # define _FAST_MUTEX_ASSERT(_Expr, _Msg) \
125 # if NVWA_USE_CXX11_MUTEX != 0
132 # define __VOLATILE volatile
139 std::mutex _M_mtx_impl;
140 # if _FAST_MUTEX_CHECK_INITIALIZATION
152 # if _FAST_MUTEX_CHECK_INITIALIZATION
153 _M_initialized =
true;
159 # if _FAST_MUTEX_CHECK_INITIALIZATION
160 _M_initialized =
false;
165 # if _FAST_MUTEX_CHECK_INITIALIZATION
177 # if _FAST_MUTEX_CHECK_INITIALIZATION
185 _M_mtx_impl.unlock();
192 # endif // NVWA_USE_CXX11_MUTEX != 0
194 # if defined(_PTHREADS) && NVWA_USE_CXX11_MUTEX == 0
195 # include <pthread.h>
201 # define __VOLATILE volatile
208 pthread_mutex_t _M_mtx_impl;
209 # if _FAST_MUTEX_CHECK_INITIALIZATION
221 ::pthread_mutex_init(&_M_mtx_impl, NULL);
222 # if _FAST_MUTEX_CHECK_INITIALIZATION
223 _M_initialized =
true;
229 # if _FAST_MUTEX_CHECK_INITIALIZATION
230 _M_initialized =
false;
232 ::pthread_mutex_destroy(&_M_mtx_impl);
236 # if _FAST_MUTEX_CHECK_INITIALIZATION
240 ::pthread_mutex_lock(&_M_mtx_impl);
253 # if _FAST_MUTEX_CHECK_INITIALIZATION
261 ::pthread_mutex_unlock(&_M_mtx_impl);
270 # if defined(_WIN32THREADS) && NVWA_USE_CXX11_MUTEX == 0
271 # ifndef WIN32_LEAN_AND_MEAN
272 # define WIN32_LEAN_AND_MEAN
274 # include <windows.h>
280 # define __VOLATILE volatile
287 CRITICAL_SECTION _M_mtx_impl;
288 # if _FAST_MUTEX_CHECK_INITIALIZATION
300 ::InitializeCriticalSection(&_M_mtx_impl);
301 # if _FAST_MUTEX_CHECK_INITIALIZATION
302 _M_initialized =
true;
308 # if _FAST_MUTEX_CHECK_INITIALIZATION
309 _M_initialized =
false;
311 ::DeleteCriticalSection(&_M_mtx_impl);
315 # if _FAST_MUTEX_CHECK_INITIALIZATION
319 ::EnterCriticalSection(&_M_mtx_impl);
327 # if _FAST_MUTEX_CHECK_INITIALIZATION
335 ::LeaveCriticalSection(&_M_mtx_impl);
342 # endif // _WIN32THREADS
390 # endif // _NOTHREADS
412 #endif // NVWA_FAST_MUTEX_H
fast_mutex_autolock & operator=(const fast_mutex_autolock &)
fast_mutex_autolock(fast_mutex &mtx)
fast_mutex & operator=(const fast_mutex &)
#define _FAST_MUTEX_ASSERT(_Expr, _Msg)