aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/monitor/monitor.h1
-rw-r--r--monitor.c20
-rw-r--r--vl.c1
3 files changed, 22 insertions, 0 deletions
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index c5c9ea292f..a714d8ef80 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -17,6 +17,7 @@ extern Monitor *cur_mon;
bool monitor_cur_is_qmp(void);
void monitor_init(CharDriverState *chr, int flags);
+void monitor_cleanup(void);
int monitor_suspend(Monitor *mon);
void monitor_resume(Monitor *mon);
diff --git a/monitor.c b/monitor.c
index 5d68a5d6fc..5c003731e2 100644
--- a/monitor.c
+++ b/monitor.c
@@ -635,6 +635,13 @@ static void monitor_data_init(Monitor *mon)
static void monitor_data_destroy(Monitor *mon)
{
+ if (mon->chr) {
+ qemu_chr_add_handlers(mon->chr, NULL, NULL, NULL, NULL);
+ }
+ if (monitor_is_qmp(mon)) {
+ json_message_parser_destroy(&mon->qmp.parser);
+ }
+ g_free(mon->rs);
QDECREF(mon->outbuf);
qemu_mutex_destroy(&mon->out_lock);
}
@@ -4196,6 +4203,19 @@ void monitor_init(CharDriverState *chr, int flags)
qemu_mutex_unlock(&monitor_lock);
}
+void monitor_cleanup(void)
+{
+ Monitor *mon, *next;
+
+ qemu_mutex_lock(&monitor_lock);
+ QLIST_FOREACH_SAFE(mon, &mon_list, entry, next) {
+ QLIST_REMOVE(mon, entry);
+ monitor_data_destroy(mon);
+ g_free(mon);
+ }
+ qemu_mutex_unlock(&monitor_lock);
+}
+
static void bdrv_password_cb(void *opaque, const char *password,
void *readline_opaque)
{
diff --git a/vl.c b/vl.c
index e7c2c628de..a14c438d38 100644
--- a/vl.c
+++ b/vl.c
@@ -4612,6 +4612,7 @@ int main(int argc, char **argv, char **envp)
/* vhost-user must be cleaned up before chardevs. */
net_cleanup();
+ monitor_cleanup();
qemu_chr_cleanup();
return 0;