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 #else 47 # undef isthreaded /* Undo private_namespace.h definition. */ 48 # define isthreaded true 49 #endif 50 51 bool malloc_mutex_init(malloc_mutex_t *mutex); 52 void malloc_mutex_prefork(malloc_mutex_t *mutex); 53 void malloc_mutex_postfork_parent(malloc_mutex_t *mutex); 54 void malloc_mutex_postfork_child(malloc_mutex_t *mutex); 55 bool mutex_boot(void); 56 57 #endif /* JEMALLOC_H_EXTERNS */ 58 /******************************************************************************/ 59 #ifdef JEMALLOC_H_INLINES 60 61 #ifndef JEMALLOC_ENABLE_INLINE 62 void malloc_mutex_lock(malloc_mutex_t *mutex); 63 void malloc_mutex_unlock(malloc_mutex_t *mutex); 64 #endif 65 66 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_)) 67 JEMALLOC_INLINE void 68 malloc_mutex_lock(malloc_mutex_t *mutex) 69 { 70 71 if (isthreaded) { 72 #ifdef _WIN32 73 EnterCriticalSection(&mutex->lock); 74 #elif (defined(JEMALLOC_OSSPIN)) 75 OSSpinLockLock(&mutex->lock); 76 #else 77 pthread_mutex_lock(&mutex->lock); 78 #endif 79 } 80 } 81 82 JEMALLOC_INLINE void 83 malloc_mutex_unlock(malloc_mutex_t *mutex) 84 { 85 86 if (isthreaded) { 87 #ifdef _WIN32 88 LeaveCriticalSection(&mutex->lock); 89 #elif (defined(JEMALLOC_OSSPIN)) 90 OSSpinLockUnlock(&mutex->lock); 91 #else 92 pthread_mutex_unlock(&mutex->lock); 93 #endif 94 } 95 } 96 #endif 97 98 #endif /* JEMALLOC_H_INLINES */ 99 /******************************************************************************/ 100