1234370Sjasone/******************************************************************************/ 2234370Sjasone#ifdef JEMALLOC_H_TYPES 3234370Sjasone 4234370Sjasonetypedef struct malloc_mutex_s malloc_mutex_t; 5234370Sjasone 6235238Sjasone#ifdef _WIN32 7235238Sjasone# define MALLOC_MUTEX_INITIALIZER 8235238Sjasone#elif (defined(JEMALLOC_OSSPIN)) 9235238Sjasone# define MALLOC_MUTEX_INITIALIZER {0} 10234370Sjasone#elif (defined(JEMALLOC_MUTEX_INIT_CB)) 11235238Sjasone# define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, NULL} 12234370Sjasone#else 13234370Sjasone# if (defined(PTHREAD_MUTEX_ADAPTIVE_NP) && \ 14234370Sjasone defined(PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP)) 15234370Sjasone# define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_ADAPTIVE_NP 16234370Sjasone# define MALLOC_MUTEX_INITIALIZER {PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP} 17234370Sjasone# else 18234370Sjasone# define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_DEFAULT 19234370Sjasone# define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER} 20234370Sjasone# endif 21234370Sjasone#endif 22234370Sjasone 23234370Sjasone#endif /* JEMALLOC_H_TYPES */ 24234370Sjasone/******************************************************************************/ 25234370Sjasone#ifdef JEMALLOC_H_STRUCTS 26234370Sjasone 27234370Sjasonestruct malloc_mutex_s { 28235238Sjasone#ifdef _WIN32 29235238Sjasone CRITICAL_SECTION lock; 30235238Sjasone#elif (defined(JEMALLOC_OSSPIN)) 31234370Sjasone OSSpinLock lock; 32234370Sjasone#elif (defined(JEMALLOC_MUTEX_INIT_CB)) 33234370Sjasone pthread_mutex_t lock; 34234370Sjasone malloc_mutex_t *postponed_next; 35234370Sjasone#else 36234370Sjasone pthread_mutex_t lock; 37234370Sjasone#endif 38234370Sjasone}; 39234370Sjasone 40234370Sjasone#endif /* JEMALLOC_H_STRUCTS */ 41234370Sjasone/******************************************************************************/ 42234370Sjasone#ifdef JEMALLOC_H_EXTERNS 43234370Sjasone 44234370Sjasone#ifdef JEMALLOC_LAZY_LOCK 45234370Sjasoneextern bool isthreaded; 46234370Sjasone#endif 47234370Sjasone 48234370Sjasonebool malloc_mutex_init(malloc_mutex_t *mutex); 49234370Sjasonevoid malloc_mutex_prefork(malloc_mutex_t *mutex); 50234370Sjasonevoid malloc_mutex_postfork_parent(malloc_mutex_t *mutex); 51234370Sjasonevoid malloc_mutex_postfork_child(malloc_mutex_t *mutex); 52234370Sjasonebool mutex_boot(void); 53234370Sjasone 54234370Sjasone#endif /* JEMALLOC_H_EXTERNS */ 55234370Sjasone/******************************************************************************/ 56234370Sjasone#ifdef JEMALLOC_H_INLINES 57234370Sjasone 58234370Sjasone#ifndef JEMALLOC_ENABLE_INLINE 59234370Sjasonevoid malloc_mutex_lock(malloc_mutex_t *mutex); 60234370Sjasonevoid malloc_mutex_unlock(malloc_mutex_t *mutex); 61234370Sjasone#endif 62234370Sjasone 63234370Sjasone#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_)) 64234370SjasoneJEMALLOC_INLINE void 65234370Sjasonemalloc_mutex_lock(malloc_mutex_t *mutex) 66234370Sjasone{ 67234370Sjasone 68234370Sjasone if (isthreaded) { 69235238Sjasone#ifdef _WIN32 70235238Sjasone EnterCriticalSection(&mutex->lock); 71235238Sjasone#elif (defined(JEMALLOC_OSSPIN)) 72234370Sjasone OSSpinLockLock(&mutex->lock); 73234370Sjasone#else 74234370Sjasone pthread_mutex_lock(&mutex->lock); 75234370Sjasone#endif 76234370Sjasone } 77234370Sjasone} 78234370Sjasone 79234370SjasoneJEMALLOC_INLINE void 80234370Sjasonemalloc_mutex_unlock(malloc_mutex_t *mutex) 81234370Sjasone{ 82234370Sjasone 83234370Sjasone if (isthreaded) { 84235238Sjasone#ifdef _WIN32 85235238Sjasone LeaveCriticalSection(&mutex->lock); 86235238Sjasone#elif (defined(JEMALLOC_OSSPIN)) 87234370Sjasone OSSpinLockUnlock(&mutex->lock); 88234370Sjasone#else 89234370Sjasone pthread_mutex_unlock(&mutex->lock); 90234370Sjasone#endif 91234370Sjasone } 92234370Sjasone} 93234370Sjasone#endif 94234370Sjasone 95234370Sjasone#endif /* JEMALLOC_H_INLINES */ 96234370Sjasone/******************************************************************************/ 97