1 /******************************************************************************/ 2 #ifdef JEMALLOC_H_TYPES 3 4 typedef 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 27 struct 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 45 extern bool isthreaded; 46 #endif 47 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); 54 55 #endif /* JEMALLOC_H_EXTERNS */ 56 /******************************************************************************/ 57 #ifdef JEMALLOC_H_INLINES 58 59 #ifndef JEMALLOC_ENABLE_INLINE 60 void malloc_mutex_lock(malloc_mutex_t *mutex); 61 void malloc_mutex_unlock(malloc_mutex_t *mutex); 62 #endif 63 64 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_)) 65 JEMALLOC_INLINE void malloc_mutex_lock(malloc_mutex_t * mutex)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 80 JEMALLOC_INLINE void malloc_mutex_unlock(malloc_mutex_t * mutex)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