qdev: Clean up qdev_connect_gpio_out_named()
Both qdev_connect_gpio_out_named() and device_set_realized() put objects without a parent into the "/machine/unattached/" orphanage. qdev_connect_gpio_out_named() needs a lengthy comment to explain how it works. It exploits that object_property_add_child() can fail only when we got a parent already, and ignoring that error does what we want. True. If it failed due to "duplicate property", we'd be in trouble, but that would be a programming error. device_set_realized() is cleaner: it checks whether we need a parent, then calls object_property_add_child(), aborting on failure. No need for a comment, and programming errors get caught. Change qdev_connect_gpio_out_named() to match. Cc: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20200505152926.18877-14-armbru@redhat.com>
This commit is contained in:
parent
5462cc8110
commit
9f742c28f5
@ -542,15 +542,12 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
|
|||||||
{
|
{
|
||||||
char *propname = g_strdup_printf("%s[%d]",
|
char *propname = g_strdup_printf("%s[%d]",
|
||||||
name ? name : "unnamed-gpio-out", n);
|
name ? name : "unnamed-gpio-out", n);
|
||||||
if (pin) {
|
if (pin && !OBJECT(pin)->parent) {
|
||||||
/* We need a name for object_property_set_link to work. If the
|
/* We need a name for object_property_set_link to work */
|
||||||
* object has a parent, object_property_add_child will come back
|
|
||||||
* with an error without doing anything. If it has none, it will
|
|
||||||
* never fail. So we can just call it with a NULL Error pointer.
|
|
||||||
*/
|
|
||||||
object_property_add_child(container_get(qdev_get_machine(),
|
object_property_add_child(container_get(qdev_get_machine(),
|
||||||
"/unattached"),
|
"/unattached"),
|
||||||
"non-qdev-gpio[*]", OBJECT(pin), NULL);
|
"non-qdev-gpio[*]", OBJECT(pin),
|
||||||
|
&error_abort);
|
||||||
}
|
}
|
||||||
object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
|
object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
|
||||||
g_free(propname);
|
g_free(propname);
|
||||||
|
Loading…
Reference in New Issue
Block a user