1/******************************************************************************/
2#ifdef JEMALLOC_H_TYPES
3
4typedef struct malloc_mutex_s malloc_mutex_t;
5
6#ifdef _WIN32
7#  define MALLOC_MUTEX_INITIALIZER
8#elif (defined(JEMALLOC_OSSPIN))
9#  define MALLOC_MUTEX_INITIALIZER {0}
10#elif (defined(JEMALLOC_MUTEX_INIT_CB))
11#  define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, NULL}
12#else
13#  if (defined(PTHREAD_MUTEX_ADAPTIVE_NP) &&				\
14       defined(PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP))
15#    define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_ADAPTIVE_NP
16#    define MALLOC_MUTEX_INITIALIZER {PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP}
17#  else
18#    define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_DEFAULT
19#    define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER}
20#  endif
21#endif
22
23#endif /* JEMALLOC_H_TYPES */
24/******************************************************************************/
25#ifdef JEMALLOC_H_STRUCTS
26
27struct malloc_mutex_s {
28#ifdef _WIN32
29	CRITICAL_SECTION	lock;
30#elif (defined(JEMALLOC_OSSPIN))
31	OSSpinLock		lock;
32#elif (defined(JEMALLOC_MUTEX_INIT_CB))
33	pthread_mutex_t		lock;
34	malloc_mutex_t		*postponed_next;
35#else
36	pthread_mutex_t		lock;
37#endif
38};
39
40#endif /* JEMALLOC_H_STRUCTS */
41/******************************************************************************/
42#ifdef JEMALLOC_H_EXTERNS
43
44#ifdef JEMALLOC_LAZY_LOCK
45extern bool isthreaded;
46#endif
47
48bool	malloc_mutex_init(malloc_mutex_t *mutex);
49void	malloc_mutex_prefork(malloc_mutex_t *mutex);
50void	malloc_mutex_postfork_parent(malloc_mutex_t *mutex);
51void	malloc_mutex_postfork_child(malloc_mutex_t *mutex);
52bool	malloc_mutex_first_thread(void);
53bool	mutex_boot(void);
54
55#endif /* JEMALLOC_H_EXTERNS */
56/******************************************************************************/
57#ifdef JEMALLOC_H_INLINES
58
59#ifndef JEMALLOC_ENABLE_INLINE
60void	malloc_mutex_lock(malloc_mutex_t *mutex);
61void	malloc_mutex_unlock(malloc_mutex_t *mutex);
62#endif
63
64#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_))
65JEMALLOC_INLINE void
66malloc_mutex_lock(malloc_mutex_t *mutex)
67{
68
69	if (isthreaded) {
70#ifdef _WIN32
71		EnterCriticalSection(&mutex->lock);
72#elif (defined(JEMALLOC_OSSPIN))
73		OSSpinLockLock(&mutex->lock);
74#else
75		pthread_mutex_lock(&mutex->lock);
76#endif
77	}
78}
79
80JEMALLOC_INLINE void
81malloc_mutex_unlock(malloc_mutex_t *mutex)
82{
83
84	if (isthreaded) {
85#ifdef _WIN32
86		LeaveCriticalSection(&mutex->lock);
87#elif (defined(JEMALLOC_OSSPIN))
88		OSSpinLockUnlock(&mutex->lock);
89#else
90		pthread_mutex_unlock(&mutex->lock);
91#endif
92	}
93}
94#endif
95
96#endif /* JEMALLOC_H_INLINES */
97/******************************************************************************/
98