A management tool can destroy these devices by writing an empty string into the child link property.
Signed-off-by: Anthony Liguori <[email protected]> --- hw/qdev-monitor.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c index 018b386..3f08575 100644 --- a/hw/qdev-monitor.c +++ b/hw/qdev-monitor.c @@ -469,15 +469,20 @@ DeviceState *qdev_device_add(QemuOpts *opts) return NULL; } if (qdev->id) { - object_property_add_child(qdev_get_peripheral(), qdev->id, - OBJECT(qdev), NULL); + object_property_add_nullable_child(qdev_get_peripheral(), qdev->id, + OBJECT(qdev), NULL); } else { static int anon_count; gchar *name = g_strdup_printf("device[%d]", anon_count++); - object_property_add_child(qdev_get_peripheral_anon(), name, - OBJECT(qdev), NULL); + object_property_add_nullable_child(qdev_get_peripheral_anon(), name, + OBJECT(qdev), NULL); g_free(name); - } + } + + /* Drop the allocation reference -- the container link will ensure the + object stays alive. */ + object_unref(OBJECT(qdev)); + if (qdev_init(qdev) < 0) { qerror_report(QERR_DEVICE_INIT_FAILED, driver); return NULL; -- 1.7.5.4
