Check for sem_timedwait(), which isn't available on some systems (including OpenBSD)
--- a/configure.in Sat Jan 14 02:22:40 2012 -0500
+++ b/configure.in Sun Jan 15 03:13:08 2012 -0500
@@ -1994,6 +1994,20 @@
])
AC_MSG_RESULT($have_pthread_sem)
fi
+ if test x$have_pthread_sem = xyes; then
+ AC_MSG_CHECKING(for sem_timedwait)
+ have_sem_timedwait=no
+ AC_TRY_LINK([
+ #include <pthread.h>
+ #include <semaphore.h>
+ ],[
+ sem_timedwait(NULL, NULL);
+ ],[
+ have_sem_timedwait=yes
+ AC_DEFINE(HAVE_SEM_TIMEDWAIT)
+ ])
+ AC_MSG_RESULT($have_sem_timedwait)
+ fi
# Restore the compiler flags and libraries
CFLAGS="$ac_save_cflags"; LIBS="$ac_save_libs"
--- a/include/SDL_config.h.in Sat Jan 14 02:22:40 2012 -0500
+++ b/include/SDL_config.h.in Sun Jan 15 03:13:08 2012 -0500
@@ -137,6 +137,7 @@
#undef HAVE_CLOCK_GETTIME
#undef HAVE_GETPAGESIZE
#undef HAVE_MPROTECT
+#undef HAVE_SEM_TIMEDWAIT
#else
/* We may need some replacement for stdarg.h here */
--- a/src/thread/pthread/SDL_syssem.c Sat Jan 14 02:22:40 2012 -0500
+++ b/src/thread/pthread/SDL_syssem.c Sun Jan 15 03:13:08 2012 -0500
@@ -98,8 +98,12 @@
int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
{
int retval;
+#ifdef HAVE_SEM_TIMEDWAIT
struct timeval now;
struct timespec ts_timeout;
+#else
+ Uint32 end;
+#endif
if ( ! sem ) {
SDL_SetError("Passed a NULL semaphore");
@@ -114,6 +118,7 @@
return SDL_SemWait(sem);
}
+#ifdef HAVE_SEM_TIMEDWAIT
/* Setup the timeout. sem_timedwait doesn't wait for
* a lapse of time, but until we reach a certain time.
* This time is now plus the timeout.
@@ -141,6 +146,15 @@
if (retval == -1)
SDL_SetError(strerror(errno));
+#else
+ end = SDL_GetTicks() + timeout;
+ while ((retval = SDL_SemTryWait(sem)) == SDL_MUTEX_TIMEDOUT) {
+ if ((SDL_GetTicks() - end) >= 0) {
+ break;
+ }
+ SDL_Delay(0);
+ }
+#endif /* HAVE_SEM_TIMEDWAIT */
return retval;
}