[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v11 22/24] qapi: Finish converting to new qapi u
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v11 22/24] qapi: Finish converting to new qapi union layout |
Date: |
Tue, 27 Oct 2015 17:01:15 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
Eric Blake <address@hidden> writes:
> On 10/26/2015 04:35 PM, Eric Blake wrote:
>> We have two issues with our qapi union layout:
>> 1) Even though the QMP wire format spells the tag 'type', the
>> C code spells it 'kind', requiring some hacks in the generator.
>> 2) The C struct uses an anonymous union, which places all tag
>> values in the same namespace as all non-variant members. This
>> leads to spurious collisions if a tag value matches a QMP name.
>
> You asked for an updated commit message (but that request was made
> against v10:
> https://lists.gnu.org/archive/html/qemu-devel/2015-10/msg06216.html).
>
> There, you suggested "a non-variant member name" rather than "QMP name"
> - it works for me, but you'd want to make that change for all of
> 13-22/25 (since I copy-pasted the same intro to each). Or decide which
> ones you want to squash together.
I went through all commit messages and tweaked around occurences of QMP.
I pushed the result to qapi-next; please have a look.
> For your other comment in that mail (mentioning an example test), I
> think I already got close to what you asked for, but have one tweak below:
>
>>
>> This patch is the back end for a series that converts to a
>> saner qapi union layout. Now that all clients have been
>> converted to use 'type' and 'obj->u.value', we can drop the
>> temporary parallel support for 'kind' and 'obj->value'.
>>
>> Given a simple union qapi type:
>>
>> { 'union':'Foo', 'data': { 'a':'int', 'b':'bool' } }
>>
>> this is the overall effect, when compared to the state before
>> this series of patches:
>>
>> | struct Foo {
>> |- FooKind kind;
>> |- union { /* union tag is @kind */
>> |+ FooKind type;
>> |+ union { /* union tag is @type */
>> | void *data;
>> | int64_t a;
>> | bool b;
>> |- };
>> |+ } u;
>> | };
>>
>> There are still some further changes that can be made to the
>> testsuite now that there is no longer a collision between
>> enum tag values and QMP names, as well as adding a reservation
>> of 'u' to avoid a collision between QMP and our choice of union
>> naming, but those will be later patches.
>
> Change this paragraph to something along these lines:
>
> The testsuite still contains some examples of artificial restrictions
> (see flat-union-clash-type.json, for example) that are no longer
> technically necessary, now that there is no longer a collision between
> enum tag values and non-variant member names; but fixing this will be
> done in later patches, in part because some further changes are required
> to keep QAPISchema*.check() from asserting. Also, a later patch will
> add a reservation for the member name 'u' to avoid a collision between a
> user's non-variant names and our internal choice of C union name.
Done.
>>
>> Note, however, that we do not rename the generated enum, which
>> is still 'FooKind'. A further patch could generate implicit
>> enums as 'FooType', but while the generator already reserved
>> the '*Kind' namespace (commit 4dc2e69), there are already QMP
>> constructs with '*Type' naming, which means changing our
>> reservation namespace would have lots of churn to C code to
>> deal with a forced name change.
>>
>> Signed-off-by: Eric Blake <address@hidden>
>>
>> ---
[Qemu-devel] [PATCH v11 15/24] block: Convert to new qapi union layout, Eric Blake, 2015/10/26
[Qemu-devel] [PATCH v11 03/24] qapi: More robust conditions for when labels are needed, Eric Blake, 2015/10/26
[Qemu-devel] [PATCH v11 23/24] qapi: Reserve 'u' member name, Eric Blake, 2015/10/26
[Qemu-devel] [PATCH v11 16/24] sockets: Convert to new qapi union layout, Eric Blake, 2015/10/26
[Qemu-devel] [PATCH v11 17/24] net: Convert to new qapi union layout, Eric Blake, 2015/10/26