Fixed bug 1426 - SDL_SemWaitTimeout returns -1 and sets error instead of SDL_MUTEX_TIMEDOUT on time out SDL-1.2
authorSam Lantinga <slouken@libsdl.org>
Mon, 20 Feb 2012 23:51:08 -0500
branchSDL-1.2
changeset 6297 c787fb1b5699
parent 6294 7a2e0f7b30cb
child 6306 2b923729fd01
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
test/testsem.c
--- a/src/thread/pthread/SDL_syssem.c	Mon Feb 20 20:55:23 2012 -0500
+++ b/src/thread/pthread/SDL_syssem.c	Mon Feb 20 23:51:08 2012 -0500
@@ -144,8 +144,14 @@
 		retval = sem_timedwait(&sem->sem, &ts_timeout);
 	while (retval == -1 && errno == EINTR);
 
-	if (retval == -1)
-		SDL_SetError(strerror(errno));
+	if (retval == -1) {
+		if (errno == ETIMEDOUT) {
+			retval = SDL_MUTEX_TIMEDOUT;
+		}
+		else {
+			SDL_SetError(strerror(errno));
+		}
+	}
 #else
 	end = SDL_GetTicks() + timeout;
 	while ((retval = SDL_SemTryWait(sem)) == SDL_MUTEX_TIMEDOUT) {
--- a/test/testsem.c	Mon Feb 20 20:55:23 2012 -0500
+++ b/test/testsem.c	Mon Feb 20 23:51:08 2012 -0500
@@ -38,12 +38,13 @@
 	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;
@@ -53,6 +54,10 @@
 		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 main(int argc, char **argv)