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) {
119 #if FAKE_RECURSIVE_MUTEX
120 pthread_t this_thread;
128 #if FAKE_RECURSIVE_MUTEX
129 this_thread = pthread_self();
130 if (mutex->
owner == this_thread) {
137 if (pthread_mutex_trylock(&mutex->
id) == 0) {
138 mutex->
owner = this_thread;
140 }
else if (errno == EBUSY) {
143 retval =
SDL_SetError(
"pthread_mutex_trylock() failed");
147 if (pthread_mutex_trylock(&mutex->
id) != 0) {
148 if (errno == EBUSY) {
151 retval =
SDL_SetError(
"pthread_mutex_trylock() failed");
165 #if FAKE_RECURSIVE_MUTEX
167 if (pthread_self() == mutex->
owner) {
177 pthread_mutex_unlock(&mutex->
id);
184 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_calloc(size_t nmemb, size_t size)
void SDL_DestroyMutex(SDL_mutex *mutex)
int SDL_UnlockMutex(SDL_mutex *mutex)
SDL_mutex * SDL_CreateMutex(void)
#define SDL_OutOfMemory()