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(JEMALLOC_HAVE_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 # if _WIN32_WINNT >= 0x0600 30 SRWLOCK lock; 31 # else 32 CRITICAL_SECTION lock; 33 # endif 34 #elif (defined(JEMALLOC_OSSPIN)) 35 OSSpinLock lock; 36 #elif (defined(JEMALLOC_MUTEX_INIT_CB)) 37 pthread_mutex_t lock; 38 malloc_mutex_t *postponed_next; 39 #else 40 pthread_mutex_t lock; 41 #endif 42 }; 43 44 #endif /* JEMALLOC_H_STRUCTS */ 45 /******************************************************************************/ 46 #ifdef JEMALLOC_H_EXTERNS 47 48 #ifdef JEMALLOC_LAZY_LOCK 49 extern bool isthreaded; 50 #endif 51 52 bool malloc_mutex_init(malloc_mutex_t *mutex); 53 void malloc_mutex_prefork(malloc_mutex_t *mutex); 54 void malloc_mutex_postfork_parent(malloc_mutex_t *mutex); 55 void malloc_mutex_postfork_child(malloc_mutex_t *mutex); 56 bool malloc_mutex_first_thread(void); 57 bool mutex_boot(void); 58 59 #endif /* JEMALLOC_H_EXTERNS */ 60 /******************************************************************************/ 61 #ifdef JEMALLOC_H_INLINES 62 63 #ifndef JEMALLOC_ENABLE_INLINE 64 void malloc_mutex_lock(malloc_mutex_t *mutex); 65 void malloc_mutex_unlock(malloc_mutex_t *mutex); 66 #endif 67 68 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_)) 69 JEMALLOC_INLINE void 70 malloc_mutex_lock(malloc_mutex_t *mutex) 71 { 72 73 if (isthreaded) { 74 #ifdef _WIN32 75 # if _WIN32_WINNT >= 0x0600 76 AcquireSRWLockExclusive(&mutex->lock); 77 # else 78 EnterCriticalSection(&mutex->lock); 79 # endif 80 #elif (defined(JEMALLOC_OSSPIN)) 81 OSSpinLockLock(&mutex->lock); 82 #else 83 pthread_mutex_lock(&mutex->lock); 84 #endif 85 } 86 } 87 88 JEMALLOC_INLINE void 89 malloc_mutex_unlock(malloc_mutex_t *mutex) 90 { 91 92 if (isthreaded) { 93 #ifdef _WIN32 94 # if _WIN32_WINNT >= 0x0600 95 ReleaseSRWLockExclusive(&mutex->lock); 96 # else 97 LeaveCriticalSection(&mutex->lock); 98 # endif 99 #elif (defined(JEMALLOC_OSSPIN)) 100 OSSpinLockUnlock(&mutex->lock); 101 #else 102 pthread_mutex_unlock(&mutex->lock); 103 #endif 104 } 105 } 106 #endif 107 108 #endif /* JEMALLOC_H_INLINES */ 109 /******************************************************************************/ 110