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