• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #else
51 #  undef isthreaded /* Undo private_namespace.h definition. */
52 #  define isthreaded true
53 #endif
54 
55 bool	malloc_mutex_init(malloc_mutex_t *mutex);
56 void	malloc_mutex_prefork(malloc_mutex_t *mutex);
57 void	malloc_mutex_postfork_parent(malloc_mutex_t *mutex);
58 void	malloc_mutex_postfork_child(malloc_mutex_t *mutex);
59 bool	mutex_boot(void);
60 
61 #endif /* JEMALLOC_H_EXTERNS */
62 /******************************************************************************/
63 #ifdef JEMALLOC_H_INLINES
64 
65 #ifndef JEMALLOC_ENABLE_INLINE
66 void	malloc_mutex_lock(malloc_mutex_t *mutex);
67 void	malloc_mutex_unlock(malloc_mutex_t *mutex);
68 #endif
69 
70 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_))
71 JEMALLOC_INLINE void
malloc_mutex_lock(malloc_mutex_t * mutex)72 malloc_mutex_lock(malloc_mutex_t *mutex)
73 {
74 
75 	if (isthreaded) {
76 #ifdef _WIN32
77 #  if _WIN32_WINNT >= 0x0600
78 		AcquireSRWLockExclusive(&mutex->lock);
79 #  else
80 		EnterCriticalSection(&mutex->lock);
81 #  endif
82 #elif (defined(JEMALLOC_OSSPIN))
83 		OSSpinLockLock(&mutex->lock);
84 #else
85 		pthread_mutex_lock(&mutex->lock);
86 #endif
87 	}
88 }
89 
90 JEMALLOC_INLINE void
malloc_mutex_unlock(malloc_mutex_t * mutex)91 malloc_mutex_unlock(malloc_mutex_t *mutex)
92 {
93 
94 	if (isthreaded) {
95 #ifdef _WIN32
96 #  if _WIN32_WINNT >= 0x0600
97 		ReleaseSRWLockExclusive(&mutex->lock);
98 #  else
99 		LeaveCriticalSection(&mutex->lock);
100 #  endif
101 #elif (defined(JEMALLOC_OSSPIN))
102 		OSSpinLockUnlock(&mutex->lock);
103 #else
104 		pthread_mutex_unlock(&mutex->lock);
105 #endif
106 	}
107 }
108 #endif
109 
110 #endif /* JEMALLOC_H_INLINES */
111 /******************************************************************************/
112