21 #include "../../SDL_internal.h"
28 #if !SDL_THREAD_PTHREAD_RECURSIVE_MUTEX && \
29 !SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP
30 #define FAKE_RECURSIVE_MUTEX 1
36 #if FAKE_RECURSIVE_MUTEX
46 pthread_mutexattr_t attr;
51 pthread_mutexattr_init(&attr);
52 #if SDL_THREAD_PTHREAD_RECURSIVE_MUTEX
53 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
54 #elif SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP
55 pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
59 if (pthread_mutex_init(&mutex->
id, &attr) != 0) {
74 pthread_mutex_destroy(&mutex->
id);
83 #if FAKE_RECURSIVE_MUTEX
84 pthread_t this_thread;
91 #if FAKE_RECURSIVE_MUTEX
92 this_thread = pthread_self();
93 if (mutex->
owner == this_thread) {
100 if (pthread_mutex_lock(&mutex->
id) == 0) {
101 mutex->
owner = this_thread;
108 if (pthread_mutex_lock(&mutex->
id) != 0) {
120 #if FAKE_RECURSIVE_MUTEX
121 pthread_t this_thread;
129 #if FAKE_RECURSIVE_MUTEX
130 this_thread = pthread_self();
131 if (mutex->
owner == this_thread) {
138 result = pthread_mutex_trylock(&mutex->
id);
140 mutex->
owner = this_thread;
142 }
else if (result == EBUSY) {
145 retval =
SDL_SetError(
"pthread_mutex_trylock() failed");
149 result = pthread_mutex_trylock(&mutex->
id);
151 if (result == EBUSY) {
154 retval =
SDL_SetError(
"pthread_mutex_trylock() failed");
168 #if FAKE_RECURSIVE_MUTEX
170 if (pthread_self() == mutex->
owner) {
180 pthread_mutex_unlock(&mutex->
id);
187 if (pthread_mutex_unlock(&mutex->
id) != 0) {
int SDL_TryLockMutex(SDL_mutex *mutex)
int SDL_LockMutex(SDL_mutex *mutex)
#define SDL_MUTEX_TIMEDOUT
void SDL_DestroyMutex(SDL_mutex *mutex)
int SDL_UnlockMutex(SDL_mutex *mutex)
SDL_mutex * SDL_CreateMutex(void)
#define SDL_OutOfMemory()