xref: /redis-3.2.3/deps/jemalloc/src/mutex.c (revision c9d0c362)
1 #define	JEMALLOC_MUTEX_C_
2 #include "jemalloc/internal/jemalloc_internal.h"
3 
4 /******************************************************************************/
5 /* Data. */
6 
7 #ifdef JEMALLOC_LAZY_LOCK
8 bool isthreaded = false;
9 #endif
10 
11 #ifdef JEMALLOC_LAZY_LOCK
12 static void	pthread_create_once(void);
13 #endif
14 
15 /******************************************************************************/
16 /*
17  * We intercept pthread_create() calls in order to toggle isthreaded if the
18  * process goes multi-threaded.
19  */
20 
21 #ifdef JEMALLOC_LAZY_LOCK
22 static int (*pthread_create_fptr)(pthread_t *__restrict, const pthread_attr_t *,
23     void *(*)(void *), void *__restrict);
24 
25 static void
26 pthread_create_once(void)
27 {
28 
29 	pthread_create_fptr = dlsym(RTLD_NEXT, "pthread_create");
30 	if (pthread_create_fptr == NULL) {
31 		malloc_write("<jemalloc>: Error in dlsym(RTLD_NEXT, "
32 		    "\"pthread_create\")\n");
33 		abort();
34 	}
35 
36 	isthreaded = true;
37 }
38 
39 JEMALLOC_ATTR(visibility("default"))
40 int
41 pthread_create(pthread_t *__restrict thread,
42     const pthread_attr_t *__restrict attr, void *(*start_routine)(void *),
43     void *__restrict arg)
44 {
45 	static pthread_once_t once_control = PTHREAD_ONCE_INIT;
46 
47 	pthread_once(&once_control, pthread_create_once);
48 
49 	return (pthread_create_fptr(thread, attr, start_routine, arg));
50 }
51 #endif
52 
53 /******************************************************************************/
54 
55 bool
56 malloc_mutex_init(malloc_mutex_t *mutex)
57 {
58 #ifdef JEMALLOC_OSSPIN
59 	*mutex = 0;
60 #else
61 	pthread_mutexattr_t attr;
62 
63 	if (pthread_mutexattr_init(&attr) != 0)
64 		return (true);
65 #ifdef PTHREAD_MUTEX_ADAPTIVE_NP
66 	pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ADAPTIVE_NP);
67 #else
68 	pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT);
69 #endif
70 	if (pthread_mutex_init(mutex, &attr) != 0) {
71 		pthread_mutexattr_destroy(&attr);
72 		return (true);
73 	}
74 	pthread_mutexattr_destroy(&attr);
75 
76 #endif
77 	return (false);
78 }
79 
80 void
81 malloc_mutex_destroy(malloc_mutex_t *mutex)
82 {
83 
84 #ifndef JEMALLOC_OSSPIN
85 	if (pthread_mutex_destroy(mutex) != 0) {
86 		malloc_write("<jemalloc>: Error in pthread_mutex_destroy()\n");
87 		abort();
88 	}
89 #endif
90 }
91