From 170ed57e174befdd37f6b4a38f5bfbff9ecfb0a4 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 20 Feb 2012 23:51:53 -0500 Subject: [PATCH] Fixed bug 1426 - SDL_SemWaitTimeout returns -1 and sets error instead of SDL_MUTEX_TIMEDOUT on time out deraj 2012-02-19 19:01:08 PST Fix to treat ETIMEDOUT as a time out instead of an error (and update the test) --- src/thread/pthread/SDL_syssem.c | 6 +++++- test/testsem.c | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/thread/pthread/SDL_syssem.c b/src/thread/pthread/SDL_syssem.c index 01d8f461a..91959c1b6 100755 --- a/src/thread/pthread/SDL_syssem.c +++ b/src/thread/pthread/SDL_syssem.c @@ -150,7 +150,11 @@ SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout) } while (retval < 0 && errno == EINTR); if (retval < 0) { - SDL_SetError("sem_timedwait() failed"); + if (errno == ETIMEDOUT) { + retval = SDL_MUTEX_TIMEDOUT; + } else { + SDL_SetError(strerror(errno)); + } } #else end = SDL_GetTicks() + timeout; diff --git a/test/testsem.c b/test/testsem.c index 62d15a6ac..9d5d027a3 100644 --- a/test/testsem.c +++ b/test/testsem.c @@ -56,12 +56,13 @@ TestWaitTimeout(void) Uint32 start_ticks; Uint32 end_ticks; Uint32 duration; + int retval; sem = SDL_CreateSemaphore(0); printf("Waiting 2 seconds on semaphore\n"); start_ticks = SDL_GetTicks(); - SDL_SemWaitTimeout(sem, 2000); + retval = SDL_SemWaitTimeout(sem, 2000); end_ticks = SDL_GetTicks(); duration = end_ticks - start_ticks; @@ -71,6 +72,10 @@ TestWaitTimeout(void) printf("Wait done.\n"); else fprintf(stderr, "Wait took %d milliseconds\n", duration); + + /* Check to make sure the return value indicates timed out */ + if (retval != SDL_MUTEX_TIMEDOUT) + fprintf(stderr, "SDL_SemWaitTimeout returned: %d; expected: %d\n", retval, SDL_MUTEX_TIMEDOUT); } int