From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52377) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYEyM-00034s-Si for qemu-devel@nongnu.org; Tue, 23 Feb 2016 10:33:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aYEyJ-0003Ba-MK for qemu-devel@nongnu.org; Tue, 23 Feb 2016 10:33:58 -0500 Received: from mx1.redhat.com ([209.132.183.28]:32880) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYEyJ-0003BW-F9 for qemu-devel@nongnu.org; Tue, 23 Feb 2016 10:33:55 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 10DE8C00B8C7 for ; Tue, 23 Feb 2016 15:33:54 +0000 (UTC) Date: Tue, 23 Feb 2016 15:33:51 +0000 From: "Daniel P. Berrange" Message-ID: <20160223153351.GJ22780@redhat.com> References: <1455884286-26272-1-git-send-email-armbru@redhat.com> <1455884286-26272-15-git-send-email-armbru@redhat.com> <20160223145039.GH22780@redhat.com> <56CC785F.9020708@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <56CC785F.9020708@redhat.com> Subject: Re: [Qemu-devel] [PULL 14/15] qapi: Don't box branches of flat unions Reply-To: "Daniel P. Berrange" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Eric Blake Cc: Markus Armbruster , qemu-devel@nongnu.org On Tue, Feb 23, 2016 at 08:18:55AM -0700, Eric Blake wrote: > On 02/23/2016 07:50 AM, Daniel P. Berrange wrote: > > On Fri, Feb 19, 2016 at 01:18:05PM +0100, Markus Armbruster wrote: > >> From: Eric Blake > >> > >> There's no reason to do two malloc's for a flat union; let's just > >> inline the branch struct directly into the C union branch of the > >> flat union. > >> > > > > > My code needs todo something a little different though - it needs > > to directly visit one of the union branches. Previously, I could > > allocate a QCryptoBlockOptions and then visit a specific union > > branch like this: > > > > QCryptoBlockOptions *opts = NULL; > > > > opts = g_new0(QCryptoBlockOptions, 1); > > opts.format = Q_CRYPTO_BLOCK_FORMAT_LUKS > > > > visit_type_QCryptoBlockOptionsLUKS(v, "luks", &opts.u.luks, errp) > > which allocated a pointer and visited the fields. We no longer need the > pointer, but still need the fields visited. > > > > > > > I need todo this, because my visitor instance does not have any > > 'format' field to visit - we know the format upfront from the > > block layer driver choice. So we need to directly visit the > > appropriate inline union branch. This no longer works, because > > the opts.u.luks field is now inlined instead of being boxed :-( > > You're using OptsVisitor, right? Is it possible to hack the QemuOpts > that you feed to opts_visitor_new() to include a 'format' field? Yes, using QemuOpts, so I could feed in a fake 'format' i guess. The temp hack I chose was to use an intermediate variable and then memcpy & free. ie QCryptoBlockOpenOptions *ret; QCryptoBlockOptionsLUKS *tmp; ret = g_new0(QCryptoBlockOpenOptions, 1); ret->format = format; visit_type_QCryptoBlockOptionsLUKS(opts_get_visitor(ov), "luks", &tmp, &local_err); if (!local_err) { memcpy(&ret->u.luks, tmp, sizeof(*tmp)); g_free(tmp); } > > I could visit_type_QCryptoBlockOptionsLUKS_fields(v, opts.u.luks, errp) > > but the '_fields' methods are all declared static in qapi-visit.c > > preventing their use. > > > > IMHO, now that QAPI inlines the flat unions, we should be making > > the _fields() methods public. > > But my suggestion would just be a hack. Yours makes more sense in the > long run, so I'll go ahead and propose that patch. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|