diff options
| author | Markus Armbruster <armbru@redhat.com> | 2020-05-05 17:29:21 +0200 |
|---|---|---|
| committer | Markus Armbruster <armbru@redhat.com> | 2020-05-15 07:07:58 +0200 |
| commit | 9f742c28f52d55ff83dc441a0cea365239a4906d (patch) | |
| tree | c0e2cbef83276a24fba9c43df94b0940064514a1 | |
| parent | 5462cc8110845f88ae80b82799121d15c9c3a8fc (diff) | |
| download | focaccia-qemu-9f742c28f52d55ff83dc441a0cea365239a4906d.tar.gz focaccia-qemu-9f742c28f52d55ff83dc441a0cea365239a4906d.zip | |
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>
| -rw-r--r-- | hw/core/qdev.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/hw/core/qdev.c b/hw/core/qdev.c index ea7118ab0e..2e6c29ba78 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -542,15 +542,12 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, { char *propname = g_strdup_printf("%s[%d]", name ? name : "unnamed-gpio-out", n); - if (pin) { - /* We need a name for object_property_set_link to work. If the - * 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. - */ + if (pin && !OBJECT(pin)->parent) { + /* We need a name for object_property_set_link to work */ object_property_add_child(container_get(qdev_get_machine(), "/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); g_free(propname); |