aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-02-01 12:01:34 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-02-01 12:01:34 +0000
commitef532054c0de7c4a548e0124b42acf9477f580d5 (patch)
tree73e8e86e54a830bb32e9634e8d36e2c3f3bc4523 /tools
parent9ea53031203037bf8ae43f72465f1df93fdc234a (diff)
downloadxen-ef532054c0de7c4a548e0124b42acf9477f580d5.tar.gz
xen-ef532054c0de7c4a548e0124b42acf9477f580d5.tar.bz2
xen-ef532054c0de7c4a548e0124b42acf9477f580d5.zip
hvm: Fix 'xm save' bug in qhich qemu-dm ignores SIGTERM.
When saving a guest in early ChangeSet (Before 16750), Xend will send "SIGKILL" signal to kill qemu process. But in ChangeSet 16750, the signal is modified to "SIGTERM". However, "SIGTERM" handler has been registered by SDL in qemu. So when qemu process receives a "SIGTERM", SDL will catch it and it will push out a "SDL_QUIT" even to qemu. If qemu can receive that event, it will be successfully terminated. While we do "xm save", qemu can't go out from the dead loop "while (suspend_requested) {...}" in main_loop() to handle the SQL_QUIT event. So it is unable to poll that "SDL_QUIT" event. This makes xm save command hang. This fix enables qemu to poll the "SDL_QUIT" event while doing save. Signed-off-by: Xu Dongxiao <dongxiao.xu@intel.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/ioemu/target-i386-dm/helper2.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/tools/ioemu/target-i386-dm/helper2.c b/tools/ioemu/target-i386-dm/helper2.c
index d3668ac64c..e831a5f133 100644
--- a/tools/ioemu/target-i386-dm/helper2.c
+++ b/tools/ioemu/target-i386-dm/helper2.c
@@ -672,11 +672,28 @@ int main_loop(void)
xenstore_record_dm_state("paused");
/* Wait to be allowed to continue */
- while (suspend_requested) {
+ while (suspend_requested && !shutdown_requested) {
+ /*
+ * Poll for shutdown via SDL every 10ms.
+ * This is needed because SDL steals SIGTERM and only lets us
+ * know about it after gui_update().
+ */
+ struct timeval tv;
+ tv.tv_sec = 0;
+ tv.tv_usec = 10000;
+
FD_ZERO(&fds);
FD_SET(xenstore_fd(), &fds);
- if (select(xenstore_fd() + 1, &fds, NULL, NULL, NULL) > 0)
+ if (select(xenstore_fd() + 1, &fds, NULL, NULL, &tv) > 0)
xenstore_process_event(NULL);
+
+ /* Refresh SDL state and pick up any pending shutdown request. */
+ gui_update();
+ }
+
+ if (shutdown_requested) {
+ ret = EXCP_INTERRUPT;
+ break;
}
xenstore_record_dm_state("running");