int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp);
bool vnc_display_reload_certs(const char *id, Error **errp);
bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp);
+void vnc_cleanup(void);
/* input.c */
int index_from_key(const char *key, size_t key_length);
#include "system/confidential-guest-support.h"
#include "system/system.h"
#include "system/tpm.h"
+#include "ui/console.h"
+
#include "trace.h"
static NotifierList exit_notifiers =
monitor_cleanup();
qemu_chr_cleanup();
user_creatable_cleanup();
+#ifdef CONFIG_VNC
+ vnc_cleanup();
+#endif
/* TODO: unref root container, check all devices are ok */
}
static void vnc_display_close(VncDisplay *vd)
{
+ VncState *vs;
+
assert(vd);
+ QTAILQ_FOREACH(vs, &vd->clients, next) {
+ vnc_disconnect_start(vs);
+ }
if (vd->listener) {
qio_net_listener_disconnect(vd->listener);
object_unref(OBJECT(vd->listener));
return;
}
- assert(QTAILQ_EMPTY(&vd->clients));
+ vnc_display_close(vd);
+ while (!QTAILQ_EMPTY(&vd->clients)) {
+ main_loop_wait(false);
+ }
vnc_stop_worker_thread(vd);
- vnc_display_close(vd);
unregister_displaychangelistener(&vd->dcl);
qkbd_state_free(vd->kbd);
qemu_del_vm_change_state_handler(vd->vmstate_handler_entry);
return vnc_display_new(id, errp) != NULL ? 0 : -1;
}
+void vnc_cleanup(void)
+{
+ VncDisplay *vd, *vd_next;
+
+ QTAILQ_FOREACH_SAFE(vd, &vnc_displays, next, vd_next) {
+ vnc_display_free(vd);
+ }
+}
+
static void vnc_register_config(void)
{
qemu_add_opts(&qemu_vnc_opts);