diff test/threadwin.c @ 1151:be9c9c8f6d53

Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe if SDL is built with a non-cdecl calling convention, and it's just generally bad practice anyhow. Now programs explicitly call SDL_Quit() where appropriate, wrap SDL_Quit() in a cdecl function where it can't be avoided, and rely on the parachute where a crash might have hit the atexit() before (these ARE test programs, after all!).
author Ryan C. Gordon <icculus@icculus.org>
date Wed, 28 Sep 2005 11:36:20 +0000
parents cb40b26523a5
children 14717b52abc0
line wrap: on
line diff
--- a/test/threadwin.c	Wed Sep 28 06:38:22 2005 +0000
+++ b/test/threadwin.c	Wed Sep 28 11:36:20 2005 +0000
@@ -14,6 +14,13 @@
 /* Is the cursor visible? */
 static int visible = 1;
 
+/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
+static void quit(int rc)
+{
+	SDL_Quit();
+	exit(rc);
+}
+
 SDL_Surface *LoadIconSurface(char *file, Uint8 **maskp)
 {
 	SDL_Surface *icon;
@@ -260,9 +267,8 @@
 	if ( SDL_Init(init_flags) < 0 ) {
 		fprintf(stderr,
 			"Couldn't initialize SDL: %s\n", SDL_GetError());
-		exit(1);
+		return(1);
 	}
-	atexit(SDL_Quit);
 
 	/* Set the icon -- this must be done before the first mode set */
 	icon = LoadIconSurface("icon.bmp", &icon_mask);
@@ -277,7 +283,7 @@
 	if (  screen == NULL ) {
 		fprintf(stderr, "Couldn't set 640x480x%d video mode: %s\n",
 						video_bpp, SDL_GetError());
-		exit(1);
+		quit(1);
 	}
 	printf("Running in %s mode\n", screen->flags & SDL_FULLSCREEN ?
 						"fullscreen" : "windowed");
@@ -302,7 +308,7 @@
 	if ( SDL_LockSurface(screen) < 0 ) {
 		fprintf(stderr, "Couldn't lock display surface: %s\n",
 							SDL_GetError());
-		exit(2);
+		quit(2);
 	}
 	buffer = (Uint8 *)screen->pixels;
 	for ( i=0; i<screen->h; ++i ) {
@@ -326,5 +332,6 @@
 	}
 	SDL_WaitThread(mouse_thread, NULL);
 	SDL_WaitThread(keybd_thread, NULL);
+	SDL_Quit();
 	return(0);
 }