]> git.saurik.com Git - redis.git/blame - deps/jemalloc/src/mutex.c
Globals protection global() function modified for speed and correctness.
[redis.git] / deps / jemalloc / src / mutex.c
CommitLineData
a78e148b 1#define JEMALLOC_MUTEX_C_
2#include "jemalloc/internal/jemalloc_internal.h"
3
4/******************************************************************************/
5/* Data. */
6
7#ifdef JEMALLOC_LAZY_LOCK
8bool isthreaded = false;
9#endif
10
11#ifdef JEMALLOC_LAZY_LOCK
12static 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
22static int (*pthread_create_fptr)(pthread_t *__restrict, const pthread_attr_t *,
23 void *(*)(void *), void *__restrict);
24
25static void
26pthread_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
39JEMALLOC_ATTR(visibility("default"))
40int
41pthread_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
55bool
56malloc_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
80void
81malloc_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}