[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 05/11] qdev: move deletion of children from finalize
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 05/11] qdev: move deletion of children from finalize to unparent |
Date: |
Wed, 5 Dec 2012 21:44:36 +0100 |
A device will never be finalized as long as it has a reference from
other devices that sit on its buses. To ensure that the references
go away, deassociate a bus from its children in the unparent callback
for the bus.
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/qdev.c | 37 +++++++++++++++++++++++++------------
1 file changed, 25 insertions(+), 12 deletions(-)
diff --git a/hw/qdev.c b/hw/qdev.c
index 87dfcb5..12b1529 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -446,6 +446,25 @@ void qbus_init(BusState *bus, DeviceState *parent, const
char *name)
}
}
+static void qbus_remove_children(Object *obj)
+{
+ BusState *bus = BUS(obj);
+ BusChild *kid;
+
+ while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
+ DeviceState *dev = kid->child;
+ qdev_free(dev);
+ }
+ if (bus->parent) {
+ QLIST_REMOVE(bus, sibling);
+ bus->parent->num_child_bus--;
+ bus->parent = NULL;
+ } else {
+ assert(bus != sysbus_get_default()); /* main_system_bus is never freed
*/
+ qemu_unregister_reset(qbus_reset_all_fn, bus);
+ }
+}
+
void qbus_create_inplace(BusState *bus, const char *typename,
DeviceState *parent, const char *name)
{
@@ -761,22 +780,15 @@ static void qbus_initfn(Object *obj)
QTAILQ_INIT(&bus->children);
}
+static void bus_class_init(ObjectClass *class, void *data)
+{
+ class->unparent = qbus_remove_children;
+}
+
static void qbus_finalize(Object *obj)
{
BusState *bus = BUS(obj);
- BusChild *kid;
- while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
- DeviceState *dev = kid->child;
- qdev_free(dev);
- }
- if (bus->parent) {
- QLIST_REMOVE(bus, sibling);
- bus->parent->num_child_bus--;
- } else {
- assert(bus != sysbus_get_default()); /* main_system_bus is never freed
*/
- qemu_unregister_reset(qbus_reset_all_fn, bus);
- }
g_free((char *)bus->name);
}
@@ -788,6 +800,7 @@ static const TypeInfo bus_info = {
.class_size = sizeof(BusClass),
.instance_init = qbus_initfn,
.instance_finalize = qbus_finalize,
+ .class_init = bus_class_init,
};
static void qdev_register_types(void)
--
1.8.0.1
- [Qemu-devel] [PATCH 00/11] qdev: correct reference counting, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 01/11] qdev: export and use qbus_init, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 02/11] qdev: use object_new, not g_malloc to create buses, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 03/11] qom: preserve object while unparenting it, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 04/11] qdev: add reference count to a device for the BusChild, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 05/11] qdev: move deletion of children from finalize to unparent,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 06/11] qdev: move unrealization of devices from finalize to unparent, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 07/11] qdev: add reference for the bus while it is referred to by the DeviceState, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 08/11] qdev: inline object_delete into qbus_free/qdev_free, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 09/11] qdev: drop extra references at creation time, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 11/11] qom: remove object_delete, Paolo Bonzini, 2012/12/05
- [Qemu-devel] [PATCH 10/11] cpu: do not use object_delete, Paolo Bonzini, 2012/12/05
- Re: [Qemu-devel] [PATCH 00/11] qdev: correct reference counting, Paolo Bonzini, 2012/12/17