diff options
-rw-r--r-- | include/monitor/monitor.h | 1 | ||||
-rw-r--r-- | monitor.c | 20 | ||||
-rw-r--r-- | vl.c | 1 |
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); @@ -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) { @@ -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; |