Make sure sem_wait didn't return early with EINTR. Fixes Bugzilla #231.

This commit is contained in:
Ryan C. Gordon
2006-05-17 23:42:48 +00:00
parent 0e9999cdab
commit 1890f79cea
3 changed files with 13 additions and 4 deletions

View File

@@ -19,6 +19,9 @@
Sam Lantinga Sam Lantinga
slouken@libsdl.org slouken@libsdl.org
*/ */
#include <errno.h>
#include "SDL_config.h" #include "SDL_config.h"
/* An implementation of semaphores using mutexes and condition variables */ /* An implementation of semaphores using mutexes and condition variables */
@@ -135,13 +138,15 @@ int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
int SDL_SemWait(SDL_sem *sem) int SDL_SemWait(SDL_sem *sem)
{ {
int retval;
if ( ! sem ) { if ( ! sem ) {
SDL_SetError("Passed a NULL semaphore"); SDL_SetError("Passed a NULL semaphore");
return -1; return -1;
} }
sem_wait(&sem->sem); while ( ((retval = sem_wait(&sem->sem)) == -1) && (errno == EINTR) ) {}
return 0; return retval;
} }
Uint32 SDL_SemValue(SDL_sem *sem) Uint32 SDL_SemValue(SDL_sem *sem)

View File

@@ -23,6 +23,7 @@
#include <pthread.h> #include <pthread.h>
#include <semaphore.h> #include <semaphore.h>
#include <errno.h>
#include "SDL_thread.h" #include "SDL_thread.h"
#include "SDL_timer.h" #include "SDL_timer.h"
@@ -86,7 +87,7 @@ int SDL_SemWait(SDL_sem *sem)
return -1; return -1;
} }
retval = sem_wait(&sem->sem); while ( ((retval = sem_wait(&sem->sem)) == -1) && (errno == EINTR) ) {}
if ( retval < 0 ) { if ( retval < 0 ) {
SDL_SetError("sem_wait() failed"); SDL_SetError("sem_wait() failed");
} }

View File

@@ -19,6 +19,9 @@
Sam Lantinga Sam Lantinga
slouken@libsdl.org slouken@libsdl.org
*/ */
#include <errno.h>
#include "SDL_config.h" #include "SDL_config.h"
/* RISC OS semiphores based on linux code */ /* RISC OS semiphores based on linux code */
@@ -132,7 +135,7 @@ int SDL_SemWait(SDL_sem *sem)
return -1; return -1;
} }
retval = sem_wait(sem->sem); while ( ((retval = sem_wait(sem->sem)) == -1) && (errno == EINTR) ) {}
if ( retval < 0 ) { if ( retval < 0 ) {
SDL_SetError("sem_wait() failed"); SDL_SetError("sem_wait() failed");
} }