Skip to content
Snippets Groups Projects
  • Markus Armbruster's avatar
    d2623129
    qom: Drop parameter @errp of object_property_add() & friends · d2623129
    Markus Armbruster authored
    
    The only way object_property_add() can fail is when a property with
    the same name already exists.  Since our property names are all
    hardcoded, failure is a programming error, and the appropriate way to
    handle it is passing &error_abort.
    
    Same for its variants, except for object_property_add_child(), which
    additionally fails when the child already has a parent.  Parentage is
    also under program control, so this is a programming error, too.
    
    We have a bit over 500 callers.  Almost half of them pass
    &error_abort, slightly fewer ignore errors, one test case handles
    errors, and the remaining few callers pass them to their own callers.
    
    The previous few commits demonstrated once again that ignoring
    programming errors is a bad idea.
    
    Of the few ones that pass on errors, several violate the Error API.
    The Error ** argument must be NULL, &error_abort, &error_fatal, or a
    pointer to a variable containing NULL.  Passing an argument of the
    latter kind twice without clearing it in between is wrong: if the
    first call sets an error, it no longer points to NULL for the second
    call.  ich9_pm_add_properties(), sparc32_ledma_realize(),
    sparc32_dma_realize(), xilinx_axidma_realize(), xilinx_enet_realize()
    are wrong that way.
    
    When the one appropriate choice of argument is &error_abort, letting
    users pick the argument is a bad idea.
    
    Drop parameter @errp and assert the preconditions instead.
    
    There's one exception to "duplicate property name is a programming
    error": the way object_property_add() implements the magic (and
    undocumented) "automatic arrayification".  Don't drop @errp there.
    Instead, rename object_property_add() to object_property_try_add(),
    and add the obvious wrapper object_property_add().
    
    Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-Id: <20200505152926.18877-15-armbru@redhat.com>
    [Two semantic rebase conflicts resolved]
    d2623129
    History
    qom: Drop parameter @errp of object_property_add() & friends
    Markus Armbruster authored
    
    The only way object_property_add() can fail is when a property with
    the same name already exists.  Since our property names are all
    hardcoded, failure is a programming error, and the appropriate way to
    handle it is passing &error_abort.
    
    Same for its variants, except for object_property_add_child(), which
    additionally fails when the child already has a parent.  Parentage is
    also under program control, so this is a programming error, too.
    
    We have a bit over 500 callers.  Almost half of them pass
    &error_abort, slightly fewer ignore errors, one test case handles
    errors, and the remaining few callers pass them to their own callers.
    
    The previous few commits demonstrated once again that ignoring
    programming errors is a bad idea.
    
    Of the few ones that pass on errors, several violate the Error API.
    The Error ** argument must be NULL, &error_abort, &error_fatal, or a
    pointer to a variable containing NULL.  Passing an argument of the
    latter kind twice without clearing it in between is wrong: if the
    first call sets an error, it no longer points to NULL for the second
    call.  ich9_pm_add_properties(), sparc32_ledma_realize(),
    sparc32_dma_realize(), xilinx_axidma_realize(), xilinx_enet_realize()
    are wrong that way.
    
    When the one appropriate choice of argument is &error_abort, letting
    users pick the argument is a bad idea.
    
    Drop parameter @errp and assert the preconditions instead.
    
    There's one exception to "duplicate property name is a programming
    error": the way object_property_add() implements the magic (and
    undocumented) "automatic arrayification".  Don't drop @errp there.
    Instead, rename object_property_add() to object_property_try_add(),
    and add the obvious wrapper object_property_add().
    
    Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-Id: <20200505152926.18877-15-armbru@redhat.com>
    [Two semantic rebase conflicts resolved]