[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v10 10/25] qapi: Unbox base members
From: |
Eric Blake |
Subject: |
Re: [Qemu-devel] [PATCH v10 10/25] qapi: Unbox base members |
Date: |
Fri, 23 Oct 2015 13:19:11 -0600 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 |
On 10/23/2015 01:14 PM, Markus Armbruster wrote:
> 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 drops a hack that was
>> needed for type-safe casting to the base class of a struct.
>>
>> Changes to the generated code look like this in qapi-types.h:
>>
>>
>> as well as:
>>
>> | static inline SpiceBasicInfo *qapi_SpiceChannel_base(const SpiceChannel
>> *obj)
>> | {
>> |- return (SpiceBasicInfo *)obj->base;
>> |+ return (SpiceBasicInfo *)obj;
>> | }
>
> No more, PATCH 09 hides this change. If you limit that one to just
> unions, it'll be visible again here, but it'll look different.
No, this change is new to v10, because of patch 09. In v9, we did not
have gen_upcast(); in v10, patch 9's version of gen_upcast() had to
special-case struct to output 'obj->base', and patch 10 gets rid of the
special case to output 'obj' always.
If I limit patch 9 to just unions, then there would be no clients using
the upcast wrappers in patch 9. The only users of upcasts that benefit
from the result of gen_upcast() are the struct users in ui/*.c, that
were touched in patch 9, and then where _this_ change in the generated
code in patch 10 lets ui/ code remain unchanged (the way the upcast
happens changed, but it was nicely hidden behind the nice wrapper
interface).
>
>>
>> and this in qapi-visit.c:
>>
>> | 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_SpiceBasiInfo_fields(v, (SpiceBasicInfo **)obj, &err);
>
> s/BasiI/BasicI/
I should have used the mouse to copy-paste instead of typing late at
night :)
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
- [Qemu-devel] [PATCH v10 04/25] qapi: Reserve '*List' type names for list types, (continued)
[Qemu-devel] [PATCH v10 10/25] qapi: Unbox base members, Eric Blake, 2015/10/23
[Qemu-devel] [PATCH v10 21/25] tpm: Convert to new qapi union layout, Eric Blake, 2015/10/23
[Qemu-devel] [PATCH v10 17/25] net: Convert to new qapi union layout, Eric Blake, 2015/10/23
[Qemu-devel] [PATCH v10 25/25] qapi: Simplify gen_struct_field(), Eric Blake, 2015/10/23
[Qemu-devel] [PATCH v10 12/25] qapi: Start converting to new qapi union layout, Eric Blake, 2015/10/23
[Qemu-devel] [PATCH v10 15/25] block: Convert to new qapi union layout, Eric Blake, 2015/10/23
[Qemu-devel] [PATCH v10 14/25] tests: Convert to new qapi union layout, Eric Blake, 2015/10/23
[Qemu-devel] [PATCH v10 09/25] qapi: Prefer typesafe upcasts to qapi base classes, Eric Blake, 2015/10/23