diff --git a/configure.in b/configure.in index b291df45a..1b2a07f26 100644 --- a/configure.in +++ b/configure.in @@ -280,6 +280,25 @@ if test x$enable_gcc_atomics = xyes; then fi fi +# Check for pthread implementation +AC_MSG_CHECKING(for pthread spinlock) +have_pthread_spinlock=no + +AC_TRY_LINK([ +#include +],[ +pthread_spinlock_t a; +pthread_spin_trylock(&a); +pthread_spin_unlock(&a); +],[ +have_pthread_spinlock=yes +]) +AC_MSG_RESULT($have_pthread_spinlock) +if test x$have_pthread_spinlock = xyes; then + AC_DEFINE(HAVE_PTHREAD_SPINLOCK, 1, [ ]) +fi + + # Standard C sources SOURCES="$SOURCES $srcdir/src/*.c" SOURCES="$SOURCES $srcdir/src/atomic/*.c" diff --git a/include/SDL_config.h.in b/include/SDL_config.h.in index b5bb3e1bd..f4ea2f84a 100644 --- a/include/SDL_config.h.in +++ b/include/SDL_config.h.in @@ -45,6 +45,7 @@ #undef SIZEOF_VOIDP #undef HAVE_GCC_ATOMICS #undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET +#undef HAVE_PTHREAD_SPINLOCK /* Comment this if you want to build without any C library requirements */ #undef HAVE_LIBC diff --git a/src/atomic/SDL_spinlock.c b/src/atomic/SDL_spinlock.c index f74de81c7..093554774 100644 --- a/src/atomic/SDL_spinlock.c +++ b/src/atomic/SDL_spinlock.c @@ -77,9 +77,13 @@ SDL_AtomicTryLock(SDL_SpinLock *lock) : "=&r" (result) : "r" (1), "r" (lock) : "cc", "memory"); return (result == 0); -#else +#elif HAVE_PTHREAD_SPINLOCK + /* pthread instructions */ + return (pthread_spin_trylock(lock) == 0); +#else /* Need CPU instructions for spinlock here! */ __need_spinlock_implementation__ + #endif } @@ -101,7 +105,10 @@ SDL_AtomicUnlock(SDL_SpinLock *lock) #elif HAVE_GCC_ATOMICS || HAVE_GCC_SYNC_LOCK_TEST_AND_SET __sync_lock_release(lock); - + +#elif HAVE_PTHREAD_SPINLOCK + pthread_spin_unlock(lock); + #else *lock = 0; #endif