1 #include "test/jemalloc_test.h"
2 
3 #ifndef _CRT_SPINCOUNT
4 #define	_CRT_SPINCOUNT 4000
5 #endif
6 
7 bool
mtx_init(mtx_t * mtx)8 mtx_init(mtx_t *mtx)
9 {
10 
11 #ifdef _WIN32
12 	if (!InitializeCriticalSectionAndSpinCount(&mtx->lock, _CRT_SPINCOUNT))
13 		return (true);
14 #elif (defined(JEMALLOC_OSSPIN))
15 	mtx->lock = 0;
16 #else
17 	pthread_mutexattr_t attr;
18 
19 	if (pthread_mutexattr_init(&attr) != 0)
20 		return (true);
21 	pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT);
22 	if (pthread_mutex_init(&mtx->lock, &attr) != 0) {
23 		pthread_mutexattr_destroy(&attr);
24 		return (true);
25 	}
26 	pthread_mutexattr_destroy(&attr);
27 #endif
28 	return (false);
29 }
30 
31 void
mtx_fini(mtx_t * mtx)32 mtx_fini(mtx_t *mtx)
33 {
34 
35 #ifdef _WIN32
36 #elif (defined(JEMALLOC_OSSPIN))
37 #else
38 	pthread_mutex_destroy(&mtx->lock);
39 #endif
40 }
41 
42 void
mtx_lock(mtx_t * mtx)43 mtx_lock(mtx_t *mtx)
44 {
45 
46 #ifdef _WIN32
47 	EnterCriticalSection(&mtx->lock);
48 #elif (defined(JEMALLOC_OSSPIN))
49 	OSSpinLockLock(&mtx->lock);
50 #else
51 	pthread_mutex_lock(&mtx->lock);
52 #endif
53 }
54 
55 void
mtx_unlock(mtx_t * mtx)56 mtx_unlock(mtx_t *mtx)
57 {
58 
59 #ifdef _WIN32
60 	LeaveCriticalSection(&mtx->lock);
61 #elif (defined(JEMALLOC_OSSPIN))
62 	OSSpinLockUnlock(&mtx->lock);
63 #else
64 	pthread_mutex_unlock(&mtx->lock);
65 #endif
66 }
67