Commit 5b08fc106d3146ddc1447d82d4770fc402fc363b
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 */ | ... | ... |
sdl.c
... | ... | @@ -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; | ... | ... |
vl.c
... | ... | @@ -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++) { | ... | ... |