chardev/spice: simplify chardev setup
Initialize spice before chardevs. That allows to register the spice chardevs directly in the init function and removes the need to maintain a linked list of chardevs just for registration. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 20201014121120.13482-5-kraxel@redhat.com
This commit is contained in:
parent
70122d6230
commit
93ab5844b2
@ -14,9 +14,6 @@ typedef struct SpiceCharSource {
|
||||
SpiceChardev *scd;
|
||||
} SpiceCharSource;
|
||||
|
||||
static QLIST_HEAD(, SpiceChardev) spice_chars =
|
||||
QLIST_HEAD_INITIALIZER(spice_chars);
|
||||
|
||||
static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len)
|
||||
{
|
||||
SpiceChardev *scd = container_of(sin, SpiceChardev, sin);
|
||||
@ -216,8 +213,6 @@ static void char_spice_finalize(Object *obj)
|
||||
|
||||
vmc_unregister_interface(s);
|
||||
|
||||
QLIST_SAFE_REMOVE(s, next);
|
||||
|
||||
g_free((char *)s->sin.subtype);
|
||||
g_free((char *)s->sin.portname);
|
||||
}
|
||||
@ -256,8 +251,6 @@ static void chr_open(Chardev *chr, const char *subtype)
|
||||
|
||||
s->active = false;
|
||||
s->sin.subtype = g_strdup(subtype);
|
||||
|
||||
QLIST_INSERT_HEAD(&spice_chars, s, next);
|
||||
}
|
||||
|
||||
static void qemu_chr_open_spice_vmc(Chardev *chr,
|
||||
@ -310,28 +303,18 @@ static void qemu_chr_open_spice_port(Chardev *chr,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!using_spice) {
|
||||
error_setg(errp, "spice not enabled");
|
||||
return;
|
||||
}
|
||||
|
||||
chr_open(chr, "port");
|
||||
|
||||
*be_opened = false;
|
||||
s = SPICE_CHARDEV(chr);
|
||||
s->sin.portname = g_strdup(name);
|
||||
|
||||
if (using_spice) {
|
||||
/* spice server already created */
|
||||
vmc_register_interface(s);
|
||||
}
|
||||
}
|
||||
|
||||
void qemu_spice_register_ports(void)
|
||||
{
|
||||
SpiceChardev *s;
|
||||
|
||||
QLIST_FOREACH(s, &spice_chars, next) {
|
||||
if (s->sin.portname == NULL) {
|
||||
continue;
|
||||
}
|
||||
vmc_register_interface(s);
|
||||
}
|
||||
vmc_register_interface(s);
|
||||
}
|
||||
|
||||
static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,
|
||||
|
@ -13,7 +13,6 @@ struct SpiceChardev {
|
||||
bool blocked;
|
||||
const uint8_t *datapos;
|
||||
int datalen;
|
||||
QLIST_ENTRY(SpiceChardev) next;
|
||||
};
|
||||
typedef struct SpiceChardev SpiceChardev;
|
||||
|
||||
|
@ -45,7 +45,6 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
|
||||
#else
|
||||
#define SPICE_NEEDS_SET_MM_TIME 0
|
||||
#endif
|
||||
void qemu_spice_register_ports(void);
|
||||
|
||||
#else /* CONFIG_SPICE */
|
||||
|
||||
|
@ -4148,6 +4148,11 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
user_creatable_add_opts_foreach,
|
||||
object_create_initial, &error_fatal);
|
||||
|
||||
/* spice needs the timers to be initialized by this point */
|
||||
/* spice must initialize before audio as it changes the default auiodev */
|
||||
/* spice must initialize before chardevs (for spicevmc and spiceport) */
|
||||
qemu_spice_init();
|
||||
|
||||
qemu_opts_foreach(qemu_find_opts("chardev"),
|
||||
chardev_init_func, NULL, &error_fatal);
|
||||
|
||||
@ -4156,10 +4161,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
fsdev_init_func, NULL, &error_fatal);
|
||||
#endif
|
||||
|
||||
/* spice needs the timers to be initialized by this point */
|
||||
/* spice must initialize before audio as it changes the default auiodev */
|
||||
qemu_spice_init();
|
||||
|
||||
/*
|
||||
* Note: we need to create audio and block backends before
|
||||
* machine_set_property(), so machine properties can refer to
|
||||
|
@ -129,7 +129,6 @@ static void spice_app_atexit(void)
|
||||
static void spice_app_display_early_init(DisplayOptions *opts)
|
||||
{
|
||||
QemuOpts *qopts;
|
||||
ChardevBackend *be = chr_spice_backend_new();
|
||||
GError *err = NULL;
|
||||
|
||||
if (opts->has_full_screen) {
|
||||
@ -174,6 +173,15 @@ static void spice_app_display_early_init(DisplayOptions *opts)
|
||||
qemu_opt_set(qopts, "gl", opts->has_gl ? "on" : "off", &error_abort);
|
||||
display_opengl = opts->has_gl;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void spice_app_display_init(DisplayState *ds, DisplayOptions *opts)
|
||||
{
|
||||
ChardevBackend *be = chr_spice_backend_new();
|
||||
QemuOpts *qopts;
|
||||
GError *err = NULL;
|
||||
gchar *uri;
|
||||
|
||||
be->u.spiceport.data->fqdn = g_strdup("org.qemu.monitor.qmp.0");
|
||||
qemu_chardev_new("org.qemu.monitor.qmp", TYPE_CHARDEV_SPICEPORT,
|
||||
be, NULL, &error_abort);
|
||||
@ -183,13 +191,6 @@ static void spice_app_display_early_init(DisplayOptions *opts)
|
||||
qemu_opt_set(qopts, "mode", "control", &error_abort);
|
||||
|
||||
qapi_free_ChardevBackend(be);
|
||||
}
|
||||
|
||||
static void spice_app_display_init(DisplayState *ds, DisplayOptions *opts)
|
||||
{
|
||||
GError *err = NULL;
|
||||
gchar *uri;
|
||||
|
||||
uri = g_strjoin("", "spice+unix://", app_dir, "/", "spice.sock", NULL);
|
||||
info_report("Launching display with URI: %s", uri);
|
||||
g_app_info_launch_default_for_uri(uri, NULL, &err);
|
||||
|
@ -812,8 +812,6 @@ void qemu_spice_init(void)
|
||||
g_free(x509_cert_file);
|
||||
g_free(x509_cacert_file);
|
||||
|
||||
qemu_spice_register_ports();
|
||||
|
||||
#ifdef HAVE_SPICE_GL
|
||||
if (qemu_opt_get_bool(opts, "gl", 0)) {
|
||||
if ((port != 0) || (tls_port != 0)) {
|
||||
|
Loading…
Reference in New Issue
Block a user