mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
qapi: Split visit_end_struct() into pieces
As mentioned in previous patches, we want to call visit_end_struct() functions unconditionally, so that visitors can release resources tied up since the matching visit_start_struct() without also having to worry about error priority if more than one error occurs. Even though error_propagate() can be safely used to ignore a second error during cleanup caused by a first error, it is simpler if the cleanup cannot set an error. So, split out the error checking portion (basically, input visitors checking for unvisited keys) into a new function visit_check_struct(), which can be safely skipped if any earlier errors are encountered, and leave the cleanup portion (which never fails, but must be called unconditionally if visit_start_struct() succeeded) in visit_end_struct(). Generated code in qapi-visit.c has diffs resembling: |@@ -59,10 +59,12 @@ void visit_type_ACPIOSTInfo(Visitor *v, | goto out_obj; | } | visit_type_ACPIOSTInfo_members(v, obj, &err); |- error_propagate(errp, err); |- err = NULL; |+ if (err) { |+ goto out_obj; |+ } |+ visit_check_struct(v, &err); | out_obj: |- visit_end_struct(v, &err); |+ visit_end_struct(v); | out: and in qapi-event.c: @@ -47,7 +47,10 @@ void qapi_event_send_acpi_device_ost(ACP | goto out; | } | visit_type_q_obj_ACPI_DEVICE_OST_arg_members(v, ¶m, &err); |- visit_end_struct(v, err ? NULL : &err); |+ if (!err) { |+ visit_check_struct(v, &err); |+ } |+ visit_end_struct(v); | if (err) { | goto out; Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <1461879932-9020-20-git-send-email-eblake@redhat.com> [Conflict with a doc fixup resolved] Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
56a6f02b8c
commit
15c2f669e3
18 changed files with 128 additions and 73 deletions
|
@ -126,7 +126,10 @@ def gen_marshal(name, arg_type, ret_type):
|
|||
goto out;
|
||||
}
|
||||
visit_type_%(c_name)s_members(v, &arg, &err);
|
||||
visit_end_struct(v, err ? NULL : &err);
|
||||
if (!err) {
|
||||
visit_check_struct(v, &err);
|
||||
}
|
||||
visit_end_struct(v);
|
||||
if (err) {
|
||||
goto out;
|
||||
}
|
||||
|
@ -157,7 +160,7 @@ out:
|
|||
v = qapi_dealloc_get_visitor(qdv);
|
||||
visit_start_struct(v, NULL, NULL, 0, NULL);
|
||||
visit_type_%(c_name)s_members(v, &arg, NULL);
|
||||
visit_end_struct(v, NULL);
|
||||
visit_end_struct(v);
|
||||
qapi_dealloc_visitor_cleanup(qdv);
|
||||
''',
|
||||
c_name=arg_type.c_name())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue