提交 667d22d1 编写于 作者: P Paolo Bonzini 提交者: Anthony Liguori

qdev: move bus removal to object_unparent

Add an ObjectClass method that is done at object_unparent time.  It
should remove any backlinks to the object in the composition tree,
so that object_delete will be able to drop the last reference and
free the object.

Use it for qdev buses.
Reviewed-by: NAndreas Färber <afaerber@suse.de>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 764b6312
......@@ -705,9 +705,6 @@ static void device_finalize(Object *obj)
qemu_opts_del(dev->opts);
}
}
if (dev->parent_bus) {
bus_remove_child(dev->parent_bus, dev);
}
}
static void device_class_base_init(ObjectClass *class, void *data)
......@@ -720,6 +717,18 @@ static void device_class_base_init(ObjectClass *class, void *data)
klass->props = NULL;
}
static void qdev_remove_from_bus(Object *obj)
{
DeviceState *dev = DEVICE(obj);
bus_remove_child(dev->parent_bus, dev);
}
static void device_class_init(ObjectClass *class, void *data)
{
class->unparent = qdev_remove_from_bus;
}
void device_reset(DeviceState *dev)
{
DeviceClass *klass = DEVICE_GET_CLASS(dev);
......@@ -747,6 +756,7 @@ static TypeInfo device_type_info = {
.instance_init = device_initfn,
.instance_finalize = device_finalize,
.class_base_init = device_class_base_init,
.class_init = device_class_init,
.abstract = true,
.class_size = sizeof(DeviceClass),
};
......
......@@ -229,6 +229,15 @@ typedef struct ObjectProperty
QTAILQ_ENTRY(ObjectProperty) node;
} ObjectProperty;
/**
* ObjectUnparent:
* @obj: the object that is being removed from the composition tree
*
* Called when an object is being removed from the QOM composition tree.
* The function should remove any backlinks from children objects to @obj.
*/
typedef void (ObjectUnparent)(Object *obj);
/**
* ObjectClass:
*
......@@ -240,6 +249,8 @@ struct ObjectClass
/*< private >*/
Type type;
GSList *interfaces;
ObjectUnparent *unparent;
};
/**
......
......@@ -363,6 +363,9 @@ void object_unparent(Object *obj)
if (obj->parent) {
object_property_del_child(obj->parent, obj, NULL);
}
if (obj->class->unparent) {
(obj->class->unparent)(obj);
}
}
static void object_deinit(Object *obj, TypeImpl *type)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册