1#ifndef THR_MUTEX_INCLUDED
2#define THR_MUTEX_INCLUDED
60#define MY_MUTEX_INIT_SLOW NULL
63#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
65#define MY_MUTEX_INIT_FAST &my_fast_mutexattr
67#define MY_MUTEX_INIT_FAST NULL
71#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
73#define MY_MUTEX_INIT_ERRCHK &my_errorcheck_mutexattr
75#define MY_MUTEX_INIT_ERRCHK NULL
82 InitializeCriticalSection(mutex);
85 return pthread_mutex_init(mutex, attr);
91 EnterCriticalSection(mutex);
94 return pthread_mutex_lock(mutex);
100 if (TryEnterCriticalSection(mutex)) {
102 if (mutex->RecursionCount > 1) {
103 LeaveCriticalSection(mutex);
110 return pthread_mutex_trylock(mutex);
116 LeaveCriticalSection(mutex);
119 return pthread_mutex_unlock(mutex);
125 DeleteCriticalSection(mutex);
128 return pthread_mutex_destroy(mutex);
141void safe_mutex_global_init();
143 const char *
file, uint line);
144int safe_mutex_lock(safe_mutex_t *mp,
bool try_lock,
const char *
file,
146int safe_mutex_unlock(safe_mutex_t *mp,
const char *
file, uint line);
147int safe_mutex_destroy(safe_mutex_t *mp,
const char *
file, uint line);
149static inline void safe_mutex_assert_owner(safe_mutex_t *mp) {
150 assert(mp !=
nullptr);
156static inline void safe_mutex_assert_not_owner(safe_mutex_t *mp) {
157 assert(mp !=
nullptr);
167 const char *
file, uint line
171 assert(mp !=
nullptr);
182 const char *
file, uint line
186 assert(mp !=
nullptr);
187 assert(mp->m_u.m_safe_ptr !=
nullptr);
188 return safe_mutex_lock(mp->m_u.m_safe_ptr,
false,
file, line);
197 const char *
file, uint line
201 assert(mp !=
nullptr);
202 assert(mp->m_u.m_safe_ptr !=
nullptr);
203 return safe_mutex_lock(mp->m_u.m_safe_ptr,
true,
file, line);
212 const char *
file, uint line
216 assert(mp !=
nullptr);
217 assert(mp->m_u.m_safe_ptr !=
nullptr);
218 return safe_mutex_unlock(mp->m_u.m_safe_ptr,
file, line);
227 const char *
file, uint line
231 assert(mp !=
nullptr);
232 assert(mp->m_u.m_safe_ptr !=
nullptr);
233 int rc = safe_mutex_destroy(mp->m_u.m_safe_ptr,
file, line);
234 free(mp->m_u.m_safe_ptr);
235 mp->m_u.m_safe_ptr =
nullptr;
#define malloc(A)
Definition: lexyy.cc:914
#define free(A)
Definition: lexyy.cc:915
Some integer typedefs for easier portability.
Defines to make different thread packages compatible.
static my_thread_t my_thread_self()
Definition: my_thread.h:74
static int my_thread_equal(my_thread_t t1, my_thread_t t2)
Definition: my_thread.h:82
pthread_t my_thread_t
Definition: my_thread_bits.h:47
static int count
Definition: myisam_ftdump.cc:44
Definition: thr_mutex_bits.h:60
static int my_mutex_init(my_mutex_t *mp, const native_mutexattr_t *attr)
Definition: thr_mutex.h:164
static int native_mutex_unlock(native_mutex_t *mutex)
Definition: thr_mutex.h:114
static int native_mutex_destroy(native_mutex_t *mutex)
Definition: thr_mutex.h:123
static int my_mutex_destroy(my_mutex_t *mp)
Definition: thr_mutex.h:224
static int native_mutex_trylock(native_mutex_t *mutex)
Definition: thr_mutex.h:98
static int native_mutex_lock(native_mutex_t *mutex)
Definition: thr_mutex.h:89
static int native_mutex_init(native_mutex_t *mutex, const native_mutexattr_t *attr)
Definition: thr_mutex.h:78
static int my_mutex_lock(my_mutex_t *mp)
Definition: thr_mutex.h:179
static int my_mutex_trylock(my_mutex_t *mp)
Definition: thr_mutex.h:194
static int my_mutex_unlock(my_mutex_t *mp)
Definition: thr_mutex.h:209
pthread_mutex_t native_mutex_t
Definition: thr_mutex_bits.h:54
pthread_mutexattr_t native_mutexattr_t
Definition: thr_mutex_bits.h:55
native_mutex_t m_native
Definition: thr_mutex_bits.h:62
safe_mutex_t * m_safe_ptr
Definition: thr_mutex_bits.h:63