1234370Sjasone/******************************************************************************/
2234370Sjasone#ifdef JEMALLOC_H_TYPES
3234370Sjasone
4234370Sjasonetypedef struct malloc_mutex_s malloc_mutex_t;
5234370Sjasone
6235238Sjasone#ifdef _WIN32
7235238Sjasone#  define MALLOC_MUTEX_INITIALIZER
8235238Sjasone#elif (defined(JEMALLOC_OSSPIN))
9235238Sjasone#  define MALLOC_MUTEX_INITIALIZER {0}
10234370Sjasone#elif (defined(JEMALLOC_MUTEX_INIT_CB))
11235238Sjasone#  define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, NULL}
12234370Sjasone#else
13234370Sjasone#  if (defined(PTHREAD_MUTEX_ADAPTIVE_NP) &&				\
14234370Sjasone       defined(PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP))
15234370Sjasone#    define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_ADAPTIVE_NP
16234370Sjasone#    define MALLOC_MUTEX_INITIALIZER {PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP}
17234370Sjasone#  else
18234370Sjasone#    define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_DEFAULT
19234370Sjasone#    define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER}
20234370Sjasone#  endif
21234370Sjasone#endif
22234370Sjasone
23234370Sjasone#endif /* JEMALLOC_H_TYPES */
24234370Sjasone/******************************************************************************/
25234370Sjasone#ifdef JEMALLOC_H_STRUCTS
26234370Sjasone
27234370Sjasonestruct malloc_mutex_s {
28235238Sjasone#ifdef _WIN32
29235238Sjasone	CRITICAL_SECTION	lock;
30235238Sjasone#elif (defined(JEMALLOC_OSSPIN))
31234370Sjasone	OSSpinLock		lock;
32234370Sjasone#elif (defined(JEMALLOC_MUTEX_INIT_CB))
33234370Sjasone	pthread_mutex_t		lock;
34234370Sjasone	malloc_mutex_t		*postponed_next;
35234370Sjasone#else
36234370Sjasone	pthread_mutex_t		lock;
37234370Sjasone#endif
38234370Sjasone};
39234370Sjasone
40234370Sjasone#endif /* JEMALLOC_H_STRUCTS */
41234370Sjasone/******************************************************************************/
42234370Sjasone#ifdef JEMALLOC_H_EXTERNS
43234370Sjasone
44234370Sjasone#ifdef JEMALLOC_LAZY_LOCK
45234370Sjasoneextern bool isthreaded;
46234370Sjasone#endif
47234370Sjasone
48234370Sjasonebool	malloc_mutex_init(malloc_mutex_t *mutex);
49234370Sjasonevoid	malloc_mutex_prefork(malloc_mutex_t *mutex);
50234370Sjasonevoid	malloc_mutex_postfork_parent(malloc_mutex_t *mutex);
51234370Sjasonevoid	malloc_mutex_postfork_child(malloc_mutex_t *mutex);
52234370Sjasonebool	mutex_boot(void);
53234370Sjasone
54234370Sjasone#endif /* JEMALLOC_H_EXTERNS */
55234370Sjasone/******************************************************************************/
56234370Sjasone#ifdef JEMALLOC_H_INLINES
57234370Sjasone
58234370Sjasone#ifndef JEMALLOC_ENABLE_INLINE
59234370Sjasonevoid	malloc_mutex_lock(malloc_mutex_t *mutex);
60234370Sjasonevoid	malloc_mutex_unlock(malloc_mutex_t *mutex);
61234370Sjasone#endif
62234370Sjasone
63234370Sjasone#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_))
64234370SjasoneJEMALLOC_INLINE void
65234370Sjasonemalloc_mutex_lock(malloc_mutex_t *mutex)
66234370Sjasone{
67234370Sjasone
68234370Sjasone	if (isthreaded) {
69235238Sjasone#ifdef _WIN32
70235238Sjasone		EnterCriticalSection(&mutex->lock);
71235238Sjasone#elif (defined(JEMALLOC_OSSPIN))
72234370Sjasone		OSSpinLockLock(&mutex->lock);
73234370Sjasone#else
74234370Sjasone		pthread_mutex_lock(&mutex->lock);
75234370Sjasone#endif
76234370Sjasone	}
77234370Sjasone}
78234370Sjasone
79234370SjasoneJEMALLOC_INLINE void
80234370Sjasonemalloc_mutex_unlock(malloc_mutex_t *mutex)
81234370Sjasone{
82234370Sjasone
83234370Sjasone	if (isthreaded) {
84235238Sjasone#ifdef _WIN32
85235238Sjasone		LeaveCriticalSection(&mutex->lock);
86235238Sjasone#elif (defined(JEMALLOC_OSSPIN))
87234370Sjasone		OSSpinLockUnlock(&mutex->lock);
88234370Sjasone#else
89234370Sjasone		pthread_mutex_unlock(&mutex->lock);
90234370Sjasone#endif
91234370Sjasone	}
92234370Sjasone}
93234370Sjasone#endif
94234370Sjasone
95234370Sjasone#endif /* JEMALLOC_H_INLINES */
96234370Sjasone/******************************************************************************/
97