1 /******************************************************************************/
2 #ifdef JEMALLOC_H_TYPES
4 typedef struct malloc_mutex_s malloc_mutex_t;
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}
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}
18 # define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_DEFAULT
19 # define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER}
23 #endif /* JEMALLOC_H_TYPES */
24 /******************************************************************************/
25 #ifdef JEMALLOC_H_STRUCTS
27 struct malloc_mutex_s {
29 CRITICAL_SECTION lock;
30 #elif (defined(JEMALLOC_OSSPIN))
32 #elif (defined(JEMALLOC_MUTEX_INIT_CB))
34 malloc_mutex_t *postponed_next;
40 #endif /* JEMALLOC_H_STRUCTS */
41 /******************************************************************************/
42 #ifdef JEMALLOC_H_EXTERNS
44 #ifdef JEMALLOC_LAZY_LOCK
45 extern bool isthreaded;
48 bool malloc_mutex_init(malloc_mutex_t *mutex);
49 void malloc_mutex_prefork(malloc_mutex_t *mutex);
50 void malloc_mutex_postfork_parent(malloc_mutex_t *mutex);
51 void malloc_mutex_postfork_child(malloc_mutex_t *mutex);
52 bool malloc_mutex_first_thread(void);
53 bool mutex_boot(void);
55 #endif /* JEMALLOC_H_EXTERNS */
56 /******************************************************************************/
57 #ifdef JEMALLOC_H_INLINES
59 #ifndef JEMALLOC_ENABLE_INLINE
60 void malloc_mutex_lock(malloc_mutex_t *mutex);
61 void malloc_mutex_unlock(malloc_mutex_t *mutex);
64 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_))
66 malloc_mutex_lock(malloc_mutex_t *mutex)
71 EnterCriticalSection(&mutex->lock);
72 #elif (defined(JEMALLOC_OSSPIN))
73 OSSpinLockLock(&mutex->lock);
75 pthread_mutex_lock(&mutex->lock);
81 malloc_mutex_unlock(malloc_mutex_t *mutex)
86 LeaveCriticalSection(&mutex->lock);
87 #elif (defined(JEMALLOC_OSSPIN))
88 OSSpinLockUnlock(&mutex->lock);
90 pthread_mutex_unlock(&mutex->lock);
96 #endif /* JEMALLOC_H_INLINES */
97 /******************************************************************************/