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