From f33068bc5ddc0ef16cd53f12d779f2d16933a096 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 15 Jan 2012 03:13:08 -0500 Subject: [PATCH] Check for sem_timedwait(), which isn't available on some systems (including OpenBSD) --- configure.in | 14 ++++++++++++++ include/SDL_config.h.in | 1 + src/thread/pthread/SDL_syssem.c | 14 ++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/configure.in b/configure.in index bd92b5e68..08c8e1e97 100644 --- a/configure.in +++ b/configure.in @@ -1994,6 +1994,20 @@ AC_HELP_STRING([--enable-pthread-sem], [use pthread semaphores [[default=yes]]]) ]) 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 + #include + ],[ + 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" diff --git a/include/SDL_config.h.in b/include/SDL_config.h.in index 10065f19c..8bb1773c0 100644 --- a/include/SDL_config.h.in +++ b/include/SDL_config.h.in @@ -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 */ diff --git a/src/thread/pthread/SDL_syssem.c b/src/thread/pthread/SDL_syssem.c index bf890e4e3..a03870fa3 100644 --- a/src/thread/pthread/SDL_syssem.c +++ b/src/thread/pthread/SDL_syssem.c @@ -98,8 +98,12 @@ int SDL_SemWait(SDL_sem *sem) 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 @@ int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) 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 @@ int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) 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; }