qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v10 10/25] qapi: Improve generated event use of


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v10 10/25] qapi: Improve generated event use of qapi visitor
Date: Mon, 01 Feb 2016 13:31:50 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Eric Blake <address@hidden> writes:

> All other successful clients of visit_start_struct() were paired
> with an unconditional visit_end_struct(); but the generated
> code for events was relying on qmp_output_visitor_cleanup() to
> work on an incomplete visit.  Alter the code to guarantee that
> the struct is completed, which will make a future patch to
> split visit_end_struct() easier to reason about.  While at it,
> drop some assertions and comments that are not present in other
> uses of the qmp output visitor, and pass NULL rather than "" as
> the 'kind' parameter (matching most other uses where obj is NULL).
>
> The changes to the generated code look like:
>
> |     qov = qmp_output_visitor_new();
> |-    g_assert(qov);
> |-
> |     v = qmp_output_get_visitor(qov);
> |-    g_assert(v);
> |
> |-    /* Fake visit, as if all members are under a structure */
> |-    visit_start_struct(v, NULL, "", "ACPI_DEVICE_OST", 0, &err);
> |+    visit_start_struct(v, NULL, NULL, "ACPI_DEVICE_OST", 0, &err);
> |     if (err) {
> |         goto out;
> |     }
> |     visit_type_ACPIOSTInfo(v, &info, "info", &err);
> |     if (err) {
> |-        goto out;
> |+        goto out_obj;
> |     }
> |-    visit_end_struct(v, &err);
> |+out_obj:
> |+    visit_end_struct(v, err ? NULL : &err);

Slightly awkward example, because out_obj is pointless in this
degenerated case.  You could pick one with multiple members (thus
multiple goto out_obj), or do pseudo-code hinting at multiple members.

> |     if (err) {
> |         goto out;
> |     }
> |
> |     obj = qmp_output_get_qobject(qov);
> |-    g_assert(obj != NULL);
> |+    g_assert(obj);
> |
> |     qdict_put_obj(qmp, "data", obj);
> |     emit(QAPI_EVENT_ACPI_DEVICE_OST, qmp, &err);
> |
> |out:
> |     qmp_output_visitor_cleanup(qov);
> |     error_propagate(errp, err);
>
> Note that the 'goto out_obj' with no intervening code before the
> label, as well as the construct of 'err ? NULL : &err', are both
> a bit unusual but also temporary; they get fixed in a later patch
> that splits visit_end_struct() to drop its errp parameter by moving
> some checking before the label.  But until that time, this was the
> simplest way to avoid the appearance of passing a possibly-set
> error to visit_end_struct(), even though actual code inspection
> shows that visit_end_struct() for a QMP output visitor will never
> set an error.
>
> Signed-off-by: Eric Blake <address@hidden>
>
> ---
> v10: avoid appearance of &err misuse; enhance commit message
> v9: save churn in declaration order for later series on boxed params,
> drop Marc-Andre's R-b
> v8: no change
> v7: place earlier in series, adjust handling of 'kind'
> v6: new patch
>
> If desired, I can defer the hunk re-ordering the declaration of
> obj to later in the series where it actually comes in handy.

Patch looks good.



reply via email to

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