qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v11 10/24] qapi: Unbox base members


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v11 10/24] qapi: Unbox base members
Date: Tue, 27 Oct 2015 08:52:59 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Eric Blake <address@hidden> writes:

> Rather than storing a base class as a pointer to a box, just
> store the fields of that base class in the same order, so that
> a child struct can be directly cast to its parent.  This gives
> less malloc overhead, less pointer dereferencing, and even less
> generated code.  Compare to the earlier commit 1e6c1616a "qapi:
> Generate a nicer struct for flat unions" (although that patch
> had fewer places to change, as less of qemu was directly using
> qapi structs for flat unions).  It also allows us to turn on
> automatic type-safe wrappers for upcasting to the base class
> of a struct.
>
> Changes to the generated code look like this in qapi-types.h:
>
> | struct SpiceChannel {
> |-    SpiceBasicInfo *base;
> |+    /* Members inherited from SpiceBasicInfo: */
> |+    char *host;
> |+    char *port;
> |+    NetworkAddressFamily family;
> |+    /* Own members: */
> |     int64_t connection_id;
>
> as well as added upcast functions like qapi_SpiceChannel_base().

"additional upcast functions" sounds better to my ears.

> Meanwhile, changes to qapi-visit.c look like:
>
> | static void visit_type_SpiceChannel_fields(Visitor *v, SpiceChannel **obj, 
> Error **errp)
> | {
> |     Error *err = NULL;
> |
> |-    visit_type_implicit_SpiceBasicInfo(v, &(*obj)->base, &err);
> |+    visit_type_SpiceBasicInfo_fields(v, (SpiceBasicInfo **)obj, &err);
> |     if (err) {
>
> (the cast is necessary, since our upcast wrappers only deal with a
> single pointer, not pointer-to-pointer); plus the wholesale
> elimination of some now-unused visit_type_implicit_FOO() functions.
>
> Without boxing, the corner case of one empty struct having
> another empty struct as its base type now requires inserting a
> dummy member (previously, the 'Base *base' member sufficed).
>
> And now that we no longer consume a 'base' member in the generated
> C struct, we can delete the former negative struct-base-clash-base
> test.
>
> Signed-off-by: Eric Blake <address@hidden>
>
> ---
> v11: delay gen_upcast for structs until here, rebase to proper use
> of gen_visit_fields_decl() in gen_visit_struct_fields(), improve
> commit message
> v10: split off some of the cleanups into earlier patches, improve
> commit message, don't emit visit_type_FOO_fields out of order,
> save positive tests in qapi-schema-tests for later
> v9: (no v6-8): hoist from v5 34/46, rebase to master

Patch looks good.  I can touch up the commit message in my tree.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]