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.
--- 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)