mutex.h revision 633aaff96787db82c06d35baf012de197a1a1902
1/******************************************************************************/ 2#ifdef JEMALLOC_H_TYPES 3 4typedef struct malloc_mutex_s malloc_mutex_t; 5 6#ifdef JEMALLOC_OSSPIN 7#define MALLOC_MUTEX_INITIALIZER {0} 8#elif (defined(JEMALLOC_MUTEX_INIT_CB)) 9#define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, NULL} 10#else 11# if (defined(PTHREAD_MUTEX_ADAPTIVE_NP) && \ 12 defined(PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP)) 13# define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_ADAPTIVE_NP 14# define MALLOC_MUTEX_INITIALIZER {PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP} 15# else 16# define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_DEFAULT 17# define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER} 18# endif 19#endif 20 21#endif /* JEMALLOC_H_TYPES */ 22/******************************************************************************/ 23#ifdef JEMALLOC_H_STRUCTS 24 25struct malloc_mutex_s { 26#ifdef JEMALLOC_OSSPIN 27 OSSpinLock lock; 28#elif (defined(JEMALLOC_MUTEX_INIT_CB)) 29 pthread_mutex_t lock; 30 malloc_mutex_t *postponed_next; 31#else 32 pthread_mutex_t lock; 33#endif 34}; 35 36#endif /* JEMALLOC_H_STRUCTS */ 37/******************************************************************************/ 38#ifdef JEMALLOC_H_EXTERNS 39 40#ifdef JEMALLOC_LAZY_LOCK 41extern bool isthreaded; 42#else 43# define isthreaded true 44#endif 45 46bool malloc_mutex_init(malloc_mutex_t *mutex); 47void malloc_mutex_prefork(malloc_mutex_t *mutex); 48void malloc_mutex_postfork_parent(malloc_mutex_t *mutex); 49void malloc_mutex_postfork_child(malloc_mutex_t *mutex); 50bool mutex_boot(void); 51 52#endif /* JEMALLOC_H_EXTERNS */ 53/******************************************************************************/ 54#ifdef JEMALLOC_H_INLINES 55 56#ifndef JEMALLOC_ENABLE_INLINE 57void malloc_mutex_lock(malloc_mutex_t *mutex); 58void malloc_mutex_unlock(malloc_mutex_t *mutex); 59#endif 60 61#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_)) 62JEMALLOC_INLINE void 63malloc_mutex_lock(malloc_mutex_t *mutex) 64{ 65 66 if (isthreaded) { 67#ifdef JEMALLOC_OSSPIN 68 OSSpinLockLock(&mutex->lock); 69#else 70 pthread_mutex_lock(&mutex->lock); 71#endif 72 } 73} 74 75JEMALLOC_INLINE void 76malloc_mutex_unlock(malloc_mutex_t *mutex) 77{ 78 79 if (isthreaded) { 80#ifdef JEMALLOC_OSSPIN 81 OSSpinLockUnlock(&mutex->lock); 82#else 83 pthread_mutex_unlock(&mutex->lock); 84#endif 85 } 86} 87#endif 88 89#endif /* JEMALLOC_H_INLINES */ 90/******************************************************************************/ 91