Date: Fri, 08 Jul 2005 22:43:48 +0200 (CEST)
authorSam Lantinga <slouken@libsdl.org>
Sun, 21 Aug 2005 06:18:54 +0000
changeset 1123 28ac87a38c17
parent 1122 e253d5448fce
child 1124 4a061326d752
Date: Fri, 08 Jul 2005 22:43:48 +0200 (CEST) From: Jiri Svoboda Subject: [SDL] signal handling bug I encountered the following bug: SDL doesn't reset signal handlers for SIGTERM and SIGINT, after calling SDL_Quit these remain hooked to the handler in SDL_quit.c, being translated into SDL_QUIT events. Consequently an application that issues a SDL_Quit and remains running will ignore any SIGTERM or SIGINT., and specifically CTRL-C presses.
src/events/SDL_active.c
src/events/SDL_events.c
src/events/SDL_events_c.h
src/events/SDL_keyboard.c
src/events/SDL_mouse.c
src/events/SDL_quit.c
--- a/src/events/SDL_active.c	Sat Aug 20 21:39:06 2005 +0000
+++ b/src/events/SDL_active.c	Sun Aug 21 06:18:54 2005 +0000
@@ -46,6 +46,9 @@
 	/* That's it! */
 	return(0);
 }
+void SDL_AppActiveQuit(void)
+{
+}
 
 Uint8 SDL_GetAppState(void)
 {
--- a/src/events/SDL_events.c	Sat Aug 20 21:39:06 2005 +0000
+++ b/src/events/SDL_events.c	Sun Aug 21 06:18:54 2005 +0000
@@ -196,6 +196,12 @@
 	/* Halt the event thread, if running */
 	SDL_StopEventThread();
 
+	/* Shutdown event handlers */
+	SDL_AppActiveQuit();
+	SDL_KeyboardQuit();
+	SDL_MouseQuit();
+	SDL_QuitQuit();
+
 	/* Clean out EventQ */
 	SDL_EventQ.head = 0;
 	SDL_EventQ.tail = 0;
--- a/src/events/SDL_events_c.h	Sat Aug 20 21:39:06 2005 +0000
+++ b/src/events/SDL_events_c.h	Sun Aug 21 06:18:54 2005 +0000
@@ -43,6 +43,12 @@
 extern int  SDL_MouseInit(void);
 extern int  SDL_QuitInit(void);
 
+/* Event handler quit routines */
+extern void SDL_AppActiveQuit(void);
+extern void SDL_KeyboardQuit(void);
+extern void SDL_MouseQuit(void);
+extern void SDL_QuitQuit(void);
+
 /* The event filter function */
 extern SDL_EventFilter SDL_EventOK;
 
--- a/src/events/SDL_keyboard.c	Sat Aug 20 21:39:06 2005 +0000
+++ b/src/events/SDL_keyboard.c	Sun Aug 21 06:18:54 2005 +0000
@@ -321,6 +321,9 @@
 	/* Done.  Whew. */
 	return(0);
 }
+void SDL_KeyboardQuit(void)
+{
+}
 
 /* We lost the keyboard, so post key up messages for all pressed keys */
 void SDL_ResetKeyboard(void)
--- a/src/events/SDL_mouse.c	Sat Aug 20 21:39:06 2005 +0000
+++ b/src/events/SDL_mouse.c	Sun Aug 21 06:18:54 2005 +0000
@@ -58,6 +58,9 @@
 	/* That's it! */
 	return(0);
 }
+void SDL_MouseQuit(void)
+{
+}
 
 /* We lost the mouse, so post button up messages for all pressed buttons */
 void SDL_ResetMouse(void)
--- a/src/events/SDL_quit.c	Sat Aug 20 21:39:06 2005 +0000
+++ b/src/events/SDL_quit.c	Sun Aug 21 06:18:54 2005 +0000
@@ -54,7 +54,7 @@
 	void (*ohandler)(int);
 
 	/* Both SIGINT and SIGTERM are translated into quit interrupts */
-	ohandler = signal(SIGINT,  SDL_HandleSIG);
+	ohandler = signal(SIGINT, SDL_HandleSIG);
 	if ( ohandler != SIG_DFL )
 		signal(SIGINT, ohandler);
 	ohandler = signal(SIGTERM, SDL_HandleSIG);
@@ -65,6 +65,19 @@
 	/* That's it! */
 	return(0);
 }
+void SDL_QuitQuit(void)
+{
+#ifndef NO_SIGNAL_H
+	void (*ohandler)(int);
+
+	ohandler = signal(SIGINT, SIG_DFL);
+	if ( ohandler != SDL_HandleSIG )
+		signal(SIGINT, ohandler);
+	ohandler = signal(SIGTERM, SIG_DFL);
+	if ( ohandler != SDL_HandleSIG )
+		signal(SIGTERM, ohandler);
+#endif /* NO_SIGNAL_H */
+}
 
 /* This function returns 1 if it's okay to close the application window */
 int SDL_PrivateQuit(void)