• E
    qapi: Split visit_end_struct() into pieces · 15c2f669
    Eric Blake 提交于
    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, &param, &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: NEric Blake <eblake@redhat.com>
    Message-Id: <1461879932-9020-20-git-send-email-eblake@redhat.com>
    [Conflict with a doc fixup resolved]
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    15c2f669
qapi-dealloc-visitor.c 5.0 KB