Check for sem_timedwait(), which isn't available on some systems (including OpenBSD) SDL-1.2
authorSam Lantinga <slouken@libsdl.org>
Sun, 15 Jan 2012 03:13:08 -0500
branchSDL-1.2
changeset 6218 f114f1434ff6
parent 6215 a84cb42bce7f
child 6224 6f013dd0add1
Check for sem_timedwait(), which isn't available on some systems (including OpenBSD)
configure.in
include/SDL_config.h.in
src/thread/pthread/SDL_syssem.c
--- 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;
 }