Il 07/01/2013 14:55, Gerd Hoffmann ha scritto: > qemu_chr_new_from_opts handles QemuOpts release now, so callers don't > have to worry. It will either be saved in CharDriverState, then > released in qemu_chr_delete, or in the error case released instantly. > > Signed-off-by: Gerd Hoffmann <kra...@redhat.com>
Reviewed-by: Paolo Bonzini <pbonz...@redhat.com> Paolo > --- > include/char/char.h | 1 + > qemu-char.c | 20 ++++++++++++++------ > 2 files changed, 15 insertions(+), 6 deletions(-) > > diff --git a/include/char/char.h b/include/char/char.h > index 1952a10..c91ce3c 100644 > --- a/include/char/char.h > +++ b/include/char/char.h > @@ -75,6 +75,7 @@ struct CharDriverState { > char *filename; > int opened; > int avail_connections; > + QemuOpts *opts; > QTAILQ_ENTRY(CharDriverState) next; > }; > > diff --git a/qemu-char.c b/qemu-char.c > index 91f64e9..a29c2bb 100644 > --- a/qemu-char.c > +++ b/qemu-char.c > @@ -2787,13 +2787,13 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts > *opts, > > if (qemu_opts_id(opts) == NULL) { > error_setg(errp, "chardev: no id specified\n"); > - return NULL; > + goto err; > } > > if (qemu_opt_get(opts, "backend") == NULL) { > error_setg(errp, "chardev: \"%s\" missing backend\n", > qemu_opts_id(opts)); > - return NULL; > + goto err; > } > for (i = 0; i < ARRAY_SIZE(backend_table); i++) { > if (strcmp(backend_table[i].name, qemu_opt_get(opts, "backend")) == > 0) > @@ -2802,14 +2802,14 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts > *opts, > if (i == ARRAY_SIZE(backend_table)) { > error_setg(errp, "chardev: backend \"%s\" not found\n", > qemu_opt_get(opts, "backend")); > - return NULL; > + goto err; > } > > chr = backend_table[i].open(opts); > if (!chr) { > error_setg(errp, "chardev: opening backend \"%s\" failed\n", > qemu_opt_get(opts, "backend")); > - return NULL; > + goto err; > } > > if (!chr->filename) > @@ -2830,7 +2830,12 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts, > chr->avail_connections = 1; > } > chr->label = g_strdup(qemu_opts_id(opts)); > + chr->opts = opts; > return chr; > + > +err: > + qemu_opts_del(opts); > + return NULL; > } > > CharDriverState *qemu_chr_new(const char *label, const char *filename, void > (*init)(struct CharDriverState *s)) > @@ -2856,7 +2861,6 @@ CharDriverState *qemu_chr_new(const char *label, const > char *filename, void (*in > if (chr && qemu_opt_get_bool(opts, "mux", 0)) { > monitor_init(chr, MONITOR_USE_READLINE); > } > - qemu_opts_del(opts); > return chr; > } > > @@ -2884,10 +2888,14 @@ void qemu_chr_fe_close(struct CharDriverState *chr) > void qemu_chr_delete(CharDriverState *chr) > { > QTAILQ_REMOVE(&chardevs, chr, next); > - if (chr->chr_close) > + if (chr->chr_close) { > chr->chr_close(chr); > + } > g_free(chr->filename); > g_free(chr->label); > + if (chr->opts) { > + qemu_opts_del(chr->opts); > + } > g_free(chr); > } > >