summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-10-06 13:52:44 +0000
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-10-06 13:52:44 +0000
commitd8f4460989d6d6749ff649f1c5439de38c2dfeab (patch)
tree4e3f50d4ec3412fc1768056bca1379af39a72771
parent1ed1a7873882b75d1c857a0b3d0415be70d886ef (diff)
downloadqemu-d8f4460989d6d6749ff649f1c5439de38c2dfeab.zip
Allow the monitor to be suspended during non-blocking op
Live migration happens in the background, but it is useful to make the monitor command appear as if it's blocking. This allows a management tool to immediately know when the live migration has completed without having to poll the migration status. This patch allows the monitor to be suspended from a monitor callback which will prevent new monitor commands from being executed. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5431 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--console.h2
-rw-r--r--monitor.c19
2 files changed, 20 insertions, 1 deletions
diff --git a/console.h b/console.h
index dd8b0397e6..fba9e299b3 100644
--- a/console.h
+++ b/console.h
@@ -175,6 +175,8 @@ void term_flush(void);
void term_print_help(void);
void monitor_readline(const char *prompt, int is_password,
char *buf, int buf_size);
+void monitor_suspend(void);
+void monitor_resume(void);
/* readline.c */
typedef void ReadLineFunc(void *opaque, const char *str);
diff --git a/monitor.c b/monitor.c
index 4f51eccdca..dd2e770e68 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2694,10 +2694,27 @@ static void term_read(void *opaque, const uint8_t *buf, int size)
readline_handle_byte(buf[i]);
}
+static int monitor_suspended;
+
static void monitor_handle_command1(void *opaque, const char *cmdline)
{
monitor_handle_command(cmdline);
- monitor_start_input();
+ if (!monitor_suspended)
+ monitor_start_input();
+ else
+ monitor_suspended = 2;
+}
+
+void monitor_suspend(void)
+{
+ monitor_suspended = 1;
+}
+
+void monitor_resume(void)
+{
+ if (monitor_suspended == 2)
+ monitor_start_input();
+ monitor_suspended = 0;
}
static void monitor_start_input(void)