]>
Commit | Line | Data |
---|---|---|
a78e148b | 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 | } |