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