From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32849) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WSWo8-0006sd-3q for qemu-devel@nongnu.org; Tue, 25 Mar 2014 15:14:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WSWo3-0005L1-LR for qemu-devel@nongnu.org; Tue, 25 Mar 2014 15:14:44 -0400 Received: from mail-oa0-f51.google.com ([209.85.219.51]:61767) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WSWo3-0005Kx-Fg for qemu-devel@nongnu.org; Tue, 25 Mar 2014 15:14:39 -0400 Received: by mail-oa0-f51.google.com with SMTP id i4so1172514oah.10 for ; Tue, 25 Mar 2014 12:14:39 -0700 (PDT) Date: Tue, 25 Mar 2014 19:13:14 +0000 From: Leandro Dorileo Message-ID: <20140325191314.GE29429@dorilex> References: <1395396763-26081-1-git-send-email-cyliu@suse.com> <1395396763-26081-10-git-send-email-cyliu@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1395396763-26081-10-git-send-email-cyliu@suse.com> Subject: Re: [Qemu-devel] [PATCH v23 09/32] add qemu_opts_append to repalce append_option_parameters List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Chunyan Liu Cc: qemu-devel@nongnu.org, stefanha@redhat.com On Fri, Mar 21, 2014 at 06:12:20PM +0800, Chunyan Liu wrote: > For later merge .create_opts of drv and proto_drv in qemu-img commands. > > Signed-off-by: Chunyan Liu Reviewed-by: Leandro Dorileo > --- > Changes: > * Following Eric's suggestion, qemu_opts_append() will accept a pair of > parameters (QEMUOptionParameter and QemuOpts), to handle the inconsistency > that some driver uses QemuOpts while some driver uses QEMUOptionParameter. > * using g_realloc of first parameter 'dst' and return it, instead of malloc > a new list and copy data from all parameters to the new list, and return > the new malloced list. Solving memory free effort for multiple append(s), > and no naming problem as in previous version. > > include/qemu/option.h | 5 ++++ > util/qemu-option.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 70 insertions(+) > > diff --git a/include/qemu/option.h b/include/qemu/option.h > index fd6f075..120c998 100644 > --- a/include/qemu/option.h > +++ b/include/qemu/option.h > @@ -175,5 +175,10 @@ void qemu_opts_print_help(QemuOptsList *list); > void qemu_opts_free(QemuOptsList *list); > QEMUOptionParameter *opts_to_params(QemuOpts *opts); > QemuOptsList *params_to_opts(QEMUOptionParameter *list); > +/* FIXME: will remove QEMUOptionParameter after all drivers switch to QemuOpts. > + */ > +QemuOptsList *qemu_opts_append(QemuOptsList *dst, > + QemuOptsList *list, > + QEMUOptionParameter *param); > > #endif > diff --git a/util/qemu-option.c b/util/qemu-option.c > index 4bdcfbf..6c304b2 100644 > --- a/util/qemu-option.c > +++ b/util/qemu-option.c > @@ -1477,3 +1477,68 @@ void qemu_opts_free(QemuOptsList *list) > > g_free(list); > } > + > +/* Realloc dst option list and append options either from an option list (list) > + * or an QEMUOptionParameter (param) to it. dst could be NULL or a malloced list. > + * FIXME: will remove QEMUOptionParameter after all drivers switch to QemuOpts. > + */ > +QemuOptsList *qemu_opts_append(QemuOptsList *dst, > + QemuOptsList *list, > + QEMUOptionParameter *param) > +{ > + size_t num_opts, num_dst_opts; > + QemuOptsList *tmp_list = NULL; > + QemuOptDesc *desc; > + bool need_init = false; > + > + assert(!(list && param)); > + if (!param &&!list) { > + return dst; > + } > + > + if (param) { > + list = tmp_list = params_to_opts(param); > + } > + > + /* If dst is NULL, after realloc, some area of dst should be initialized > + * before adding options to it. > + */ > + if (!dst) { > + need_init = true; > + } > + > + num_opts = count_opts_list(dst); > + num_dst_opts = num_opts; > + num_opts += count_opts_list(list); > + dst = g_realloc(dst, sizeof(QemuOptsList) + > + (num_opts + 1) * sizeof(QemuOptDesc)); > + if (need_init) { > + dst->name = NULL; > + dst->implied_opt_name = NULL; > + QTAILQ_INIT(&dst->head); > + dst->mallocd = true; > + } > + dst->desc[num_dst_opts].name = NULL; > + > + /* (const char *) members of result dst are malloced, need free. */ > + assert(dst->mallocd); > + /* append list->desc to dst->desc */ > + if (list) { > + desc = list->desc; > + while (desc && desc->name) { > + if (find_desc_by_name(dst->desc, desc->name) == NULL) { > + dst->desc[num_dst_opts].name = g_strdup(desc->name); > + dst->desc[num_dst_opts].type = desc->type; > + dst->desc[num_dst_opts].help = g_strdup(desc->help); > + dst->desc[num_dst_opts].def_value_str = > + g_strdup(desc->def_value_str); > + num_dst_opts++; > + dst->desc[num_dst_opts].name = NULL; > + } > + desc++; > + } > + } > + > + g_free(tmp_list); > + return dst; > +} > -- > 1.7.12.4 > > -- Leandro Dorileo