21 #include "../../SDL_internal.h" 31 #if !SDL_THREAD_PTHREAD_RECURSIVE_MUTEX && \ 32 !SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 33 #define FAKE_RECURSIVE_MUTEX 1 39 #if FAKE_RECURSIVE_MUTEX 49 pthread_mutexattr_t attr;
54 pthread_mutexattr_init(&attr);
55 #if SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 56 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
57 #elif SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 58 pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
62 if (pthread_mutex_init(&mutex->
id, &attr) != 0) {
77 pthread_mutex_destroy(&mutex->
id);
86 #if FAKE_RECURSIVE_MUTEX 87 pthread_t this_thread;
94 #if FAKE_RECURSIVE_MUTEX 95 this_thread = pthread_self();
96 if (mutex->
owner == this_thread) {
103 if (pthread_mutex_lock(&mutex->
id) == 0) {
104 mutex->
owner = this_thread;
111 if (pthread_mutex_lock(&mutex->
id) < 0) {
122 #if FAKE_RECURSIVE_MUTEX 123 pthread_t this_thread;
131 #if FAKE_RECURSIVE_MUTEX 132 this_thread = pthread_self();
133 if (mutex->
owner == this_thread) {
140 if (pthread_mutex_lock(&mutex->
id) == 0) {
141 mutex->
owner = this_thread;
143 }
else if (errno == EBUSY) {
146 retval =
SDL_SetError(
"pthread_mutex_trylock() failed");
150 if (pthread_mutex_trylock(&mutex->
id) != 0) {
151 if (errno == 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_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()