Index: src/threading.m ================================================================== --- src/threading.m +++ src/threading.m @@ -24,48 +24,26 @@ # include "threading_winapi.m" #else # error No threads available! #endif +#if !defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) && !defined(OF_WINDOWS) bool of_rmutex_new(of_rmutex_t *rmutex) { -#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) - pthread_mutexattr_t attr; - - if (pthread_mutexattr_init(&attr) != 0) - return false; - - if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) - return false; - - if (pthread_mutex_init(rmutex, &attr) != 0) - return false; - - if (pthread_mutexattr_destroy(&attr) != 0) - return false; - - return true; -#elif defined(OF_WINDOWS) - return of_mutex_new(rmutex); -#else if (!of_mutex_new(&rmutex->mutex)) return false; if (!of_tlskey_new(&rmutex->count)) return false; return true; -#endif } bool of_rmutex_lock(of_rmutex_t *rmutex) { -#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS) - return of_mutex_lock(rmutex); -#else uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 0) { if (!of_tlskey_set(rmutex->count, (void*)(count + 1))) return false; @@ -80,19 +58,15 @@ of_mutex_unlock(&rmutex->mutex); return false; } return true; -#endif } bool of_rmutex_trylock(of_rmutex_t *rmutex) { -#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS) - return of_mutex_trylock(rmutex); -#else uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 0) { if (!of_tlskey_set(rmutex->count, (void*)(count + 1))) return false; @@ -107,19 +81,15 @@ of_mutex_unlock(&rmutex->mutex); return false; } return true; -#endif } bool of_rmutex_unlock(of_rmutex_t *rmutex) { -#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS) - return of_mutex_unlock(rmutex); -#else uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 1) { if (!of_tlskey_set(rmutex->count, (void*)(count - 1))) return false; @@ -132,23 +102,19 @@ if (!of_mutex_unlock(&rmutex->mutex)) return false; return true; -#endif } bool of_rmutex_free(of_rmutex_t *rmutex) { -#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS) - return of_mutex_free(rmutex); -#else if (!of_mutex_free(&rmutex->mutex)) return false; if (!of_tlskey_free(rmutex->count)) return false; return true; -#endif } +#endif Index: src/threading_pthread.m ================================================================== --- src/threading_pthread.m +++ src/threading_pthread.m @@ -229,10 +229,56 @@ bool of_mutex_free(of_mutex_t *mutex) { return (pthread_mutex_destroy(mutex) == 0); } + +#ifdef OF_HAVE_RECURSIVE_PTHREAD_MUTEXES +bool +of_rmutex_new(of_rmutex_t *rmutex) +{ + pthread_mutexattr_t attr; + + if (pthread_mutexattr_init(&attr) != 0) + return false; + + if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) + return false; + + if (pthread_mutex_init(rmutex, &attr) != 0) + return false; + + if (pthread_mutexattr_destroy(&attr) != 0) + return false; + + return true; +} + +bool +of_rmutex_lock(of_rmutex_t *rmutex) +{ + return of_mutex_lock(rmutex); +} + +bool +of_rmutex_trylock(of_rmutex_t *rmutex) +{ + return of_mutex_trylock(rmutex); +} + +bool +of_rmutex_unlock(of_rmutex_t *rmutex) +{ + return of_mutex_unlock(rmutex); +} + +bool +of_rmutex_free(of_rmutex_t *rmutex) +{ + return of_mutex_free(rmutex); +} +#endif bool of_condition_new(of_condition_t *condition) { return (pthread_cond_init(condition, NULL) == 0); Index: src/threading_winapi.m ================================================================== --- src/threading_winapi.m +++ src/threading_winapi.m @@ -140,10 +140,40 @@ { DeleteCriticalSection(mutex); return true; } + +bool +of_rmutex_new(of_rmutex_t *rmutex) +{ + return of_mutex_new(rmutex); +} + +bool +of_rmutex_lock(of_rmutex_t *rmutex) +{ + return of_mutex_lock(rmutex); +} + +bool +of_rmutex_trylock(of_rmutex_t *rmutex) +{ + return of_mutex_trylock(rmutex); +} + +bool +of_rmutex_unlock(of_rmutex_t *rmutex) +{ + return of_mutex_unlock(rmutex); +} + +bool +of_rmutex_free(of_rmutex_t *rmutex) +{ + return of_mutex_free(rmutex); +} bool of_condition_new(of_condition_t *condition) { condition->count = 0;