Make sure sem_wait didn't return early with EINTR. Fixes Bugzilla #231.
--- a/src/thread/dc/SDL_syssem.c Wed May 17 18:57:04 2006 +0000
+++ b/src/thread/dc/SDL_syssem.c Wed May 17 23:42:48 2006 +0000
@@ -19,6 +19,9 @@
Sam Lantinga
slouken@libsdl.org
*/
+
+#include <errno.h>
+
#include "SDL_config.h"
/* An implementation of semaphores using mutexes and condition variables */
@@ -135,13 +138,15 @@
int SDL_SemWait(SDL_sem *sem)
{
+ int retval;
+
if ( ! sem ) {
SDL_SetError("Passed a NULL semaphore");
return -1;
}
- sem_wait(&sem->sem);
- return 0;
+ while ( ((retval = sem_wait(&sem->sem)) == -1) && (errno == EINTR) ) {}
+ return retval;
}
Uint32 SDL_SemValue(SDL_sem *sem)
--- a/src/thread/pthread/SDL_syssem.c Wed May 17 18:57:04 2006 +0000
+++ b/src/thread/pthread/SDL_syssem.c Wed May 17 23:42:48 2006 +0000
@@ -23,6 +23,7 @@
#include <pthread.h>
#include <semaphore.h>
+#include <errno.h>
#include "SDL_thread.h"
#include "SDL_timer.h"
@@ -86,7 +87,7 @@
return -1;
}
- retval = sem_wait(&sem->sem);
+ while ( ((retval = sem_wait(&sem->sem)) == -1) && (errno == EINTR) ) {}
if ( retval < 0 ) {
SDL_SetError("sem_wait() failed");
}
--- a/src/thread/riscos/SDL_syssem.c Wed May 17 18:57:04 2006 +0000
+++ b/src/thread/riscos/SDL_syssem.c Wed May 17 23:42:48 2006 +0000
@@ -19,6 +19,9 @@
Sam Lantinga
slouken@libsdl.org
*/
+
+#include <errno.h>
+
#include "SDL_config.h"
/* RISC OS semiphores based on linux code */
@@ -132,7 +135,7 @@
return -1;
}
- retval = sem_wait(sem->sem);
+ while ( ((retval = sem_wait(sem->sem)) == -1) && (errno == EINTR) ) {}
if ( retval < 0 ) {
SDL_SetError("sem_wait() failed");
}