1e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/******************************************************************************/ 2e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#ifdef JEMALLOC_H_TYPES 3e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 4633aaff96787db82c06d35baf012de197a1a1902Jason Evanstypedef struct malloc_mutex_s malloc_mutex_t; 5633aaff96787db82c06d35baf012de197a1a1902Jason Evans 6a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey#ifdef _WIN32 7a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey# define MALLOC_MUTEX_INITIALIZER 8a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey#elif (defined(JEMALLOC_OSSPIN)) 9a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey# define MALLOC_MUTEX_INITIALIZER {0} 10633aaff96787db82c06d35baf012de197a1a1902Jason Evans#elif (defined(JEMALLOC_MUTEX_INIT_CB)) 11a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey# define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, NULL} 12893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans#else 1341b6afb834b1f5250223678c52bd4f013d4234f6Jason Evans# if (defined(PTHREAD_MUTEX_ADAPTIVE_NP) && \ 1441b6afb834b1f5250223678c52bd4f013d4234f6Jason Evans defined(PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP)) 1541b6afb834b1f5250223678c52bd4f013d4234f6Jason Evans# define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_ADAPTIVE_NP 16633aaff96787db82c06d35baf012de197a1a1902Jason Evans# define MALLOC_MUTEX_INITIALIZER {PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP} 177372b15a31c63ac5cb9ed8aeabc2a0a3c005e8bfJason Evans# else 1841b6afb834b1f5250223678c52bd4f013d4234f6Jason Evans# define MALLOC_MUTEX_TYPE PTHREAD_MUTEX_DEFAULT 19633aaff96787db82c06d35baf012de197a1a1902Jason Evans# define MALLOC_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER} 207372b15a31c63ac5cb9ed8aeabc2a0a3c005e8bfJason Evans# endif 212dbecf1f6267fae7a161b9c39cfd4d04ce168a29Jason Evans#endif 222dbecf1f6267fae7a161b9c39cfd4d04ce168a29Jason Evans 23e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#endif /* JEMALLOC_H_TYPES */ 24e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/******************************************************************************/ 25e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#ifdef JEMALLOC_H_STRUCTS 26e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 27633aaff96787db82c06d35baf012de197a1a1902Jason Evansstruct malloc_mutex_s { 28a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey#ifdef _WIN32 29a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey CRITICAL_SECTION lock; 30a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey#elif (defined(JEMALLOC_OSSPIN)) 31633aaff96787db82c06d35baf012de197a1a1902Jason Evans OSSpinLock lock; 32633aaff96787db82c06d35baf012de197a1a1902Jason Evans#elif (defined(JEMALLOC_MUTEX_INIT_CB)) 33633aaff96787db82c06d35baf012de197a1a1902Jason Evans pthread_mutex_t lock; 34633aaff96787db82c06d35baf012de197a1a1902Jason Evans malloc_mutex_t *postponed_next; 35633aaff96787db82c06d35baf012de197a1a1902Jason Evans#else 36633aaff96787db82c06d35baf012de197a1a1902Jason Evans pthread_mutex_t lock; 37633aaff96787db82c06d35baf012de197a1a1902Jason Evans#endif 38633aaff96787db82c06d35baf012de197a1a1902Jason Evans}; 39633aaff96787db82c06d35baf012de197a1a1902Jason Evans 40e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#endif /* JEMALLOC_H_STRUCTS */ 41e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/******************************************************************************/ 42e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#ifdef JEMALLOC_H_EXTERNS 43e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 44e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#ifdef JEMALLOC_LAZY_LOCK 45e476f8a161d445211fd6e54fe370275196e66bcbJason Evansextern bool isthreaded; 46e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#else 47bedceea2a8aef427d96a77762e9d4bda9f0cc0c3Jason Evans# undef isthreaded /* Undo private_namespace.h definition. */ 48e476f8a161d445211fd6e54fe370275196e66bcbJason Evans# define isthreaded true 49e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#endif 50e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 51e476f8a161d445211fd6e54fe370275196e66bcbJason Evansbool malloc_mutex_init(malloc_mutex_t *mutex); 524e2e3dd9cf19ed5991938a708a8b50611aa5bbf8Jason Evansvoid malloc_mutex_prefork(malloc_mutex_t *mutex); 534e2e3dd9cf19ed5991938a708a8b50611aa5bbf8Jason Evansvoid malloc_mutex_postfork_parent(malloc_mutex_t *mutex); 544e2e3dd9cf19ed5991938a708a8b50611aa5bbf8Jason Evansvoid malloc_mutex_postfork_child(malloc_mutex_t *mutex); 55633aaff96787db82c06d35baf012de197a1a1902Jason Evansbool mutex_boot(void); 56e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 57e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#endif /* JEMALLOC_H_EXTERNS */ 58e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/******************************************************************************/ 59e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#ifdef JEMALLOC_H_INLINES 60e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 61e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#ifndef JEMALLOC_ENABLE_INLINE 62e476f8a161d445211fd6e54fe370275196e66bcbJason Evansvoid malloc_mutex_lock(malloc_mutex_t *mutex); 63e476f8a161d445211fd6e54fe370275196e66bcbJason Evansvoid malloc_mutex_unlock(malloc_mutex_t *mutex); 64e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#endif 65e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 66e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_)) 67e476f8a161d445211fd6e54fe370275196e66bcbJason EvansJEMALLOC_INLINE void 68e476f8a161d445211fd6e54fe370275196e66bcbJason Evansmalloc_mutex_lock(malloc_mutex_t *mutex) 69e476f8a161d445211fd6e54fe370275196e66bcbJason Evans{ 70e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 71893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans if (isthreaded) { 72a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey#ifdef _WIN32 73a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey EnterCriticalSection(&mutex->lock); 74a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey#elif (defined(JEMALLOC_OSSPIN)) 75633aaff96787db82c06d35baf012de197a1a1902Jason Evans OSSpinLockLock(&mutex->lock); 76893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans#else 77633aaff96787db82c06d35baf012de197a1a1902Jason Evans pthread_mutex_lock(&mutex->lock); 78893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans#endif 79893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans } 80e476f8a161d445211fd6e54fe370275196e66bcbJason Evans} 81e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 82e476f8a161d445211fd6e54fe370275196e66bcbJason EvansJEMALLOC_INLINE void 83e476f8a161d445211fd6e54fe370275196e66bcbJason Evansmalloc_mutex_unlock(malloc_mutex_t *mutex) 84e476f8a161d445211fd6e54fe370275196e66bcbJason Evans{ 85e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 86893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans if (isthreaded) { 87a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey#ifdef _WIN32 88a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey LeaveCriticalSection(&mutex->lock); 89a19e87fbad020e8dd3d26682032929e8e5ae71c1Mike Hommey#elif (defined(JEMALLOC_OSSPIN)) 90633aaff96787db82c06d35baf012de197a1a1902Jason Evans OSSpinLockUnlock(&mutex->lock); 91893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans#else 92633aaff96787db82c06d35baf012de197a1a1902Jason Evans pthread_mutex_unlock(&mutex->lock); 93893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans#endif 94893a0ed7c8c11962524ba6f2adeb304d038be2a9Jason Evans } 95e476f8a161d445211fd6e54fe370275196e66bcbJason Evans} 96e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#endif 97e476f8a161d445211fd6e54fe370275196e66bcbJason Evans 98e476f8a161d445211fd6e54fe370275196e66bcbJason Evans#endif /* JEMALLOC_H_INLINES */ 99e476f8a161d445211fd6e54fe370275196e66bcbJason Evans/******************************************************************************/ 100