Commit 5b08fc106d3146ddc1447d82d4770fc402fc363b

Authored by aliguori
1 parent 6f382b5e

Handle terminating signals (Gerd Hoffmann)

This patch makes qemu handle signals better.  It sets the request_shutdown
flag, making the main_loop exit and qemu taking the usual exit route, with
atexit handlers being called and so on, instead of qemu just being killed
by the signal.

To avoid calling vm_start() from the signal handler main_loop() got an
additional check so qemu_system_shutdown_request() works even when the
vm is in stopped state.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>



git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5055 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 3 changed files with 28 additions and 10 deletions
curses.c
... ... @@ -350,8 +350,6 @@ void curses_display_init(DisplayState *ds, int full_screen)
350 350 atexit(curses_atexit);
351 351  
352 352 #ifndef _WIN32
353   - signal(SIGINT, SIG_DFL);
354   - signal(SIGQUIT, SIG_DFL);
355 353 #if defined(SIGWINCH) && defined(KEY_RESIZE)
356 354 /* some curses implementations provide a handler, but we
357 355 * want to be sure this is handled regardless of the library */
... ...
... ... @@ -476,10 +476,8 @@ static void sdl_refresh(DisplayState *ds)
476 476 sdl_process_key(&ev->key);
477 477 break;
478 478 case SDL_QUIT:
479   - if (!no_quit) {
  479 + if (!no_quit)
480 480 qemu_system_shutdown_request();
481   - vm_start(); /* In case we're paused */
482   - }
483 481 break;
484 482 case SDL_MOUSEMOTION:
485 483 if (gui_grab || kbd_mouse_is_absolute() ||
... ... @@ -636,11 +634,6 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame)
636 634 fprintf(stderr, "Could not initialize SDL - exiting\n");
637 635 exit(1);
638 636 }
639   -#ifndef _WIN32
640   - /* NOTE: we still want Ctrl-C to work, so we undo the SDL redirections */
641   - signal(SIGINT, SIG_DFL);
642   - signal(SIGQUIT, SIG_DFL);
643   -#endif
644 637  
645 638 ds->dpy_update = sdl_update;
646 639 ds->dpy_resize = sdl_resize;
... ...
... ... @@ -7621,6 +7621,8 @@ static int main_loop(void)
7621 7621 timeout = 0;
7622 7622 }
7623 7623 } else {
  7624 + if (shutdown_requested)
  7625 + break;
7624 7626 timeout = 10;
7625 7627 }
7626 7628 #ifdef CONFIG_PROFILER
... ... @@ -8185,6 +8187,26 @@ static BOOL WINAPI qemu_ctrl_handler(DWORD type)
8185 8187  
8186 8188 #define MAX_NET_CLIENTS 32
8187 8189  
  8190 +#ifndef _WIN32
  8191 +
  8192 +static void termsig_handler(int signal)
  8193 +{
  8194 + qemu_system_shutdown_request();
  8195 +}
  8196 +
  8197 +void termsig_setup(void)
  8198 +{
  8199 + struct sigaction act;
  8200 +
  8201 + memset(&act, 0, sizeof(act));
  8202 + act.sa_handler = termsig_handler;
  8203 + sigaction(SIGINT, &act, NULL);
  8204 + sigaction(SIGHUP, &act, NULL);
  8205 + sigaction(SIGTERM, &act, NULL);
  8206 +}
  8207 +
  8208 +#endif
  8209 +
8188 8210 int main(int argc, char **argv)
8189 8211 {
8190 8212 #ifdef CONFIG_GDBSTUB
... ... @@ -9073,6 +9095,11 @@ int main(int argc, char **argv)
9073 9095 #endif
9074 9096 }
9075 9097  
  9098 +#ifndef _WIN32
  9099 + /* must be after terminal init, SDL library changes signal handlers */
  9100 + termsig_setup();
  9101 +#endif
  9102 +
9076 9103 /* Maintain compatibility with multiple stdio monitors */
9077 9104 if (!strcmp(monitor_device,"stdio")) {
9078 9105 for (i = 0; i < MAX_SERIAL_PORTS; i++) {
... ...