Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Favor using pthread_mutexattr_settype() on Linux.
- Loading branch information
Showing
with
32 additions
and
29 deletions.
-
+27
−22
configure.in
-
+5
−7
src/thread/linux/SDL_sysmutex.c
|
@@ -1201,6 +1201,10 @@ CheckPTHREAD() |
|
|
[ --enable-pthread-sem use pthread semaphores [default=yes]], |
|
|
, enable_pthread_sem=yes) |
|
|
case "$target" in |
|
|
*-*-linux*) |
|
|
pthread_cflags="-D_REENTRANT -D_GNU_SOURCE" |
|
|
pthread_lib="-lpthread" |
|
|
;; |
|
|
*-*-bsdi*) |
|
|
pthread_cflags="-D_REENTRANT -D_THREAD_SAFE" |
|
|
pthread_lib="" |
|
@@ -1288,29 +1292,30 @@ CheckPTHREAD() |
|
|
# Check to see if recursive mutexes are available |
|
|
AC_MSG_CHECKING(for recursive mutexes) |
|
|
has_recursive_mutexes=no |
|
|
AC_TRY_LINK([ |
|
|
#include <pthread.h> |
|
|
],[ |
|
|
pthread_mutexattr_t attr; |
|
|
#if defined(linux) && !(defined(__arm__) && defined(QWS)) |
|
|
pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP); |
|
|
#else |
|
|
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); |
|
|
#endif |
|
|
],[ |
|
|
has_recursive_mutexes=yes |
|
|
]) |
|
|
# Some systems have broken recursive mutex implementations |
|
|
case "$target" in |
|
|
*-*-darwin*) |
|
|
has_recursive_mutexes=no |
|
|
;; |
|
|
*-*-solaris*) |
|
|
has_recursive_mutexes=no |
|
|
;; |
|
|
esac |
|
|
if test x$has_recursive_mutexes = xno; then |
|
|
AC_TRY_COMPILE([ |
|
|
#include <pthread.h> |
|
|
],[ |
|
|
pthread_mutexattr_t attr; |
|
|
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); |
|
|
],[ |
|
|
has_recursive_mutexes=yes |
|
|
CFLAGS="$CFLAGS -DPTHREAD_RECURSIVE_MUTEX" |
|
|
]) |
|
|
fi |
|
|
if test x$has_recursive_mutexes = xno; then |
|
|
AC_TRY_COMPILE([ |
|
|
#include <pthread.h> |
|
|
],[ |
|
|
pthread_mutexattr_t attr; |
|
|
pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP); |
|
|
],[ |
|
|
has_recursive_mutexes=yes |
|
|
CFLAGS="$CFLAGS -DPTHREAD_RECURSIVE_MUTEX_NP" |
|
|
]) |
|
|
fi |
|
|
AC_MSG_RESULT($has_recursive_mutexes) |
|
|
if test x$has_recursive_mutexes != xyes; then |
|
|
if test x$has_recursive_mutexes = xno; then |
|
|
CFLAGS="$CFLAGS -DPTHREAD_NO_RECURSIVE_MUTEX" |
|
|
fi |
|
|
|
|
|
|
@@ -62,15 +62,13 @@ SDL_mutex *SDL_CreateMutex (void) |
|
|
mutex = (SDL_mutex *)calloc(1, sizeof(*mutex)); |
|
|
if ( mutex ) { |
|
|
pthread_mutexattr_init(&attr); |
|
|
#ifdef PTHREAD_NO_RECURSIVE_MUTEX |
|
|
/* No extra attributes necessary */ |
|
|
#else |
|
|
#ifdef linux |
|
|
#if defined(PTHREAD_RECURSIVE_MUTEX) |
|
|
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); |
|
|
#elif defined(PTHREAD_RECURSIVE_MUTEX_NP) |
|
|
pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP); |
|
|
#else |
|
|
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); |
|
|
#endif |
|
|
#endif /* PTHREAD_NO_RECURSIVE_MUTEX */ |
|
|
/* No extra attributes necessary */ |
|
|
#endif /* PTHREAD_RECURSIVE_MUTEX */ |
|
|
if ( pthread_mutex_init(&mutex->id, &attr) != 0 ) { |
|
|
SDL_SetError("pthread_mutex_init() failed"); |
|
|
free(mutex); |
|
|