]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/jemalloc/include/jemalloc/internal/mutex.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / jemalloc / include / jemalloc / internal / mutex.h
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(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         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
45 extern bool isthreaded;
46 #endif
47
48 bool    malloc_mutex_init(malloc_mutex_t *mutex);
49 void    malloc_mutex_prefork(malloc_mutex_t *mutex);
50 void    malloc_mutex_postfork_parent(malloc_mutex_t *mutex);
51 void    malloc_mutex_postfork_child(malloc_mutex_t *mutex);
52 bool    malloc_mutex_first_thread(void);
53 bool    mutex_boot(void);
54
55 #endif /* JEMALLOC_H_EXTERNS */
56 /******************************************************************************/
57 #ifdef JEMALLOC_H_INLINES
58
59 #ifndef JEMALLOC_ENABLE_INLINE
60 void    malloc_mutex_lock(malloc_mutex_t *mutex);
61 void    malloc_mutex_unlock(malloc_mutex_t *mutex);
62 #endif
63
64 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MUTEX_C_))
65 JEMALLOC_INLINE void
66 malloc_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
80 JEMALLOC_INLINE void
81 malloc_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 /******************************************************************************/