@@ -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;
A management tool can destroy these devices by writing an empty string into the child link property. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> --- hw/qdev-monitor.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-)