From: Eric Blake <eblake@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v7 10/15] qapi-event: Reduce chance of collision with event data
Date: Mon, 27 Jun 2016 21:20:54 -0600 [thread overview]
Message-ID: <5771ED16.9070100@redhat.com> (raw)
In-Reply-To: <871t3x723b.fsf@dusky.pond.sub.org>
[-- Attachment #1: Type: text/plain, Size: 4273 bytes --]
On 06/16/2016 06:25 AM, Markus Armbruster wrote:
> Markus Armbruster <armbru@redhat.com> writes:
>
>> Eric Blake <eblake@redhat.com> writes:
>>
>>> When an event has data that is not boxed, we are exposing all of
>>> its members alongside our local variables. So far, we haven't
>>> hit a collision, but it may be a matter of time before someone
>>> wants to name a QMP data element 'err' or similar. We can separate
>>> the names by making the public function a shell that creates a
>>> simple wrapper, then calls a worker that operates on only the
>>> boxed version and thus has no user-supplied names to worry about
>>> in naming its local variables. For boxed events, we don't need
>>> the wrapper.
>>>
>>> There is still a chance for collision with 'errp' (if that happens,
>>> tweak c_name() to rename a QMP member 'errp' into the C member
>>> 'q_errp'), and with 'param' (if that happens, tweak gen_event_send()
>>> and gen_param_var() to name the temporary variable 'q_param'). But
>>> with the division done here, the real worker function no longer has
>>> to worry about collisions.
>>>
>>> +++ b/scripts/qapi.py
>>> @@ -1016,7 +1016,6 @@ class QAPISchemaObjectType(QAPISchemaType):
>>> return QAPISchemaType.c_name(self)
>>>
>>> def c_type(self):
>>> - assert not self.is_implicit()
>>
>> Huh?
Required, because we now pass a pointer to an implicit type from
qapi_event_send_FOO() to do_qapi_event_send_FOO(), so the c_type() of
that implicit type is required for generating the C type for that
parameter. Will document it better in the commit message.
>>> @@ -93,20 +92,11 @@ def gen_event_send(name, arg_type, box):
>>> ret += mcgen('''
>>> v = qmp_output_visitor_new(&obj);
>>>
>>> -''')
>>> -
>>> - if box:
>>> - ret += mcgen('''
>>> - visit_type_%(c_name)s(v, NULL, &arg, &err);
>>> -''',
>>> - c_name=arg_type.c_name(), name=arg_type.name)
>>> - else:
>>> - ret += mcgen('''
>>> visit_start_struct(v, "%(name)s", NULL, 0, &err);
>>> if (err) {
>>> goto out;
>>> }
>>> - visit_type_%(c_name)s_members(v, ¶m, &err);
>>> + visit_type_%(c_name)s_members(v, arg, &err);
>>> if (!err) {
>>> visit_check_struct(v, &err);
>>> }
>>
>> Getting confused... why are we getting rid of the box case here?
No good reason. The visit_type_FOO() is more compact than
visit_type_FOO_members(), but only when we have a non-implicit type. So
for v8, I'm switching the conditional from 'if box:' to 'if
arg_type.is_implicit():', more or less.
>>
>> Too many conditionals... gen_event_send() has three cases: empty
>> arg_type, non-empty arg_type and box, non-empty arg_type and not box.
>> The commit message shows the change to generated code for the second
>> case. It doesn't show visit_type_%(c_name)s(v, NULL, &arg, &err) going
>> away.
>
> Case empty arg_type: no change
> Example: POWERDOWN
Good.
>
> Case non-empty arg_type and box: visit gets open-coded
> Example: EVENT_E
Fixed in v8 so that it no longer changes.
> The open-coded visit drops the !*obj check (okay, @arg isn't going
> anywhere), skips the visit_check_struct() differently, and drops the
> qapi_free_FOO() (okay, condition is always false here).
>
> So this isn't wrong. But why open-code?
No need to add new open-coding, but we already had existing open-coding
for anonymous non-boxed 'data' (in part because commit 7ce106a9
intentionally chose not to create visit_type_FOO() for implicit types).
>
> Case non-empty arg_type and not box:
> Example: ACPI_DEVICE_OST
>
>
> This is the case the commit message advertises.
>
> There is no visit_type_FOO() we could compare too, since FOO is an
> implicit type
And in reviewing your message, I realize we have NO testsuite coverage of:
{ 'event': 'EVENT', 'data': 'NamedStruct' }
Guess I get to add that first. Such a usage will then be improved by
using visit_type_NamedStruct() rather than open-coding around
visit_type_NamedStruct_members().
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
next prev parent reply other threads:[~2016-06-28 3:21 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-20 22:40 [Qemu-devel] [PATCH v7 00/15] qapi netdev_add introspection (post-introspection cleanups subset F) Eric Blake
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 01/15] qapi: Consolidate object visitors Eric Blake
2016-06-14 12:35 ` Markus Armbruster
2016-06-16 14:46 ` Markus Armbruster
2016-06-16 17:20 ` Eric Blake
2016-06-17 7:39 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 02/15] net: use Netdev instead of NetClientOptions in client init Eric Blake
2016-06-14 13:11 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 03/15] qapi: Require all branches of flat union enum to be covered Eric Blake
2016-06-14 13:24 ` Markus Armbruster
2016-06-14 13:46 ` Eric Blake
2016-06-28 1:52 ` Eric Blake
2016-06-28 7:57 ` Markus Armbruster
2016-07-03 2:34 ` Eric Blake
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 04/15] qapi: Hide tag_name data member of variants Eric Blake
2016-06-14 13:32 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 05/15] qapi: Add type.is_empty() helper Eric Blake
2016-06-14 14:01 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 06/15] qapi: Plumb in 'box' to qapi generator lower levels Eric Blake
2016-06-14 14:39 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 07/15] qapi: Implement boxed types for commands/events Eric Blake
2016-06-14 15:27 ` Markus Armbruster
2016-06-14 17:22 ` Eric Blake
2016-06-15 6:22 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 08/15] block: Simplify block_set_io_throttle Eric Blake
2016-05-24 15:21 ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2016-06-14 15:34 ` [Qemu-devel] " Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 09/15] block: Simplify drive-mirror Eric Blake
2016-06-14 15:42 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 10/15] qapi-event: Reduce chance of collision with event data Eric Blake
2016-06-14 16:28 ` Markus Armbruster
2016-06-16 12:25 ` Markus Armbruster
2016-06-28 3:20 ` Eric Blake [this message]
2016-06-28 8:06 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-arm] [PATCH v7 11/15] qapi: Change Netdev into a flat union Eric Blake
2016-05-20 22:40 ` Eric Blake
2016-05-20 22:40 ` [Qemu-devel] " Eric Blake
2016-06-16 13:15 ` [Qemu-arm] " Markus Armbruster
2016-06-16 13:15 ` Markus Armbruster
2016-06-16 13:15 ` [Qemu-devel] " Markus Armbruster
2016-06-16 14:35 ` [Qemu-arm] " Eric Blake
2016-06-16 14:35 ` Eric Blake
2016-06-16 14:35 ` Eric Blake
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 12/15] net: Use correct type for bool flag Eric Blake
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 13/15] net: Complete qapi-fication of netdev_add Eric Blake
2016-06-16 13:40 ` Markus Armbruster
2016-07-02 22:58 ` Eric Blake
2016-07-04 13:46 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 14/15] qapi: Allow anonymous branch types in flat union Eric Blake
2016-06-16 14:33 ` Markus Armbruster
2016-07-01 22:59 ` Eric Blake
2016-07-04 13:13 ` Markus Armbruster
2016-05-20 22:40 ` [Qemu-devel] [PATCH v7 15/15] schema: Drop pointless empty type CpuInfoOther Eric Blake
2016-05-20 22:59 ` [Qemu-devel] [PATCH v7 00/15] qapi netdev_add introspection (post-introspection cleanups subset F) Eric Blake
2016-06-16 14:57 ` Markus Armbruster
2016-06-28 18:14 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5771ED16.9070100@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.