[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 14/14] qbus: initialize in standard way
From: |
Anthony Liguori |
Subject: |
[Qemu-devel] [PATCH 14/14] qbus: initialize in standard way |
Date: |
Tue, 1 May 2012 13:18:14 -0500 |
Signed-off-by: Anthony Liguori <address@hidden>
---
hw/qdev.c | 84 +++++++++++++++++++++++++++++++++++++------------------------
1 files changed, 51 insertions(+), 33 deletions(-)
diff --git a/hw/qdev.c b/hw/qdev.c
index 166c599..f637351 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -434,40 +434,35 @@ DeviceState *qdev_find_recursive(BusState *bus, const
char *id)
return NULL;
}
-/* FIXME move this logic into instance_init */
-static void do_qbus_create_inplace(BusState *bus, const char *typename,
- DeviceState *parent, const char *name)
+static void qbus_realize(BusState *bus)
{
+ const char *typename = object_get_typename(OBJECT(bus));
char *buf;
int i,len;
- bus->parent = parent;
-
- if (name) {
+ if (bus->name) {
/* use supplied name */
- bus->name = g_strdup(name);
- } else if (parent && parent->id) {
+ } else if (bus->parent && bus->parent->id) {
/* parent device has id -> use it for bus name */
- len = strlen(parent->id) + 16;
+ len = strlen(bus->parent->id) + 16;
buf = g_malloc(len);
- snprintf(buf, len, "%s.%d", parent->id, parent->num_child_bus);
+ snprintf(buf, len, "%s.%d", bus->parent->id,
bus->parent->num_child_bus);
bus->name = buf;
} else {
/* no id -> use lowercase bus type for bus name */
len = strlen(typename) + 16;
buf = g_malloc(len);
len = snprintf(buf, len, "%s.%d", typename,
- parent ? parent->num_child_bus : 0);
+ bus->parent ? bus->parent->num_child_bus : 0);
for (i = 0; i < len; i++)
buf[i] = qemu_tolower(buf[i]);
bus->name = buf;
}
- QTAILQ_INIT(&bus->children);
- if (parent) {
- QLIST_INSERT_HEAD(&parent->child_bus, bus, sibling);
- parent->num_child_bus++;
- object_property_add_child(OBJECT(parent), bus->name, OBJECT(bus),
NULL);
+ if (bus->parent) {
+ QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
+ bus->parent->num_child_bus++;
+ object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus),
NULL);
} else if (bus != main_system_bus) {
/* TODO: once all bus devices are qdevified,
only reset handler for main_system_bus should be registered here. */
@@ -479,7 +474,10 @@ void qbus_create_inplace(BusState *bus, const char
*typename,
DeviceState *parent, const char *name)
{
object_initialize(bus, typename);
- do_qbus_create_inplace(bus, typename, parent, name);
+
+ bus->parent = parent;
+ bus->name = name ? g_strdup(name) : NULL;
+ qbus_realize(bus);
}
BusState *qbus_create(const char *typename, DeviceState *parent, const char
*name)
@@ -488,7 +486,11 @@ BusState *qbus_create(const char *typename, DeviceState
*parent, const char *nam
bus = BUS(object_new(typename));
bus->qdev_allocated = 1;
- do_qbus_create_inplace(bus, typename, parent, name);
+
+ bus->parent = parent;
+ bus->name = name ? g_strdup(name) : NULL;
+ qbus_realize(bus);
+
return bus;
}
@@ -504,22 +506,10 @@ static void main_system_bus_create(void)
void qbus_free(BusState *bus)
{
- 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 != main_system_bus); /* main_system_bus is never freed */
- qemu_unregister_reset(qbus_reset_all_fn, bus);
- }
- g_free((void*)bus->name);
if (bus->qdev_allocated) {
- g_free(bus);
+ object_delete(OBJECT(bus));
+ } else {
+ object_finalize(OBJECT(bus));
}
}
@@ -753,12 +743,40 @@ static TypeInfo device_type_info = {
.class_size = sizeof(DeviceClass),
};
+static void qbus_initfn(Object *obj)
+{
+ BusState *bus = BUS(obj);
+
+ QTAILQ_INIT(&bus->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 != main_system_bus); /* main_system_bus is never freed */
+ qemu_unregister_reset(qbus_reset_all_fn, bus);
+ }
+ g_free((void*)bus->name);
+}
+
static TypeInfo bus_info = {
.name = TYPE_BUS,
.parent = TYPE_OBJECT,
.instance_size = sizeof(BusState),
.abstract = true,
.class_size = sizeof(BusClass),
+ .instance_init = qbus_initfn,
+ .instance_finalize = qbus_finalize,
};
static void qdev_register_types(void)
--
1.7.5.4
- Re: [Qemu-devel] [PATCH 03/14] qdev: add qdev_add_properties, (continued)
- Re: [Qemu-devel] [PATCH 03/14] qdev: add qdev_add_properties, Anthony Liguori, 2012/05/01
- Re: [Qemu-devel] [PATCH 03/14] qdev: add qdev_add_properties, Andreas Färber, 2012/05/01
- Re: [Qemu-devel] [PATCH 03/14] qdev: add qdev_add_properties, Anthony Liguori, 2012/05/01
- Re: [Qemu-devel] [PATCH 03/14] qdev: add qdev_add_properties, Peter Maydell, 2012/05/01
- Re: [Qemu-devel] [PATCH 03/14] qdev: add qdev_add_properties, Anthony Liguori, 2012/05/01
- Re: [Qemu-devel] [PATCH 03/14] qdev: add qdev_add_properties, Paolo Bonzini, 2012/05/01
- Re: [Qemu-devel] [PATCH 03/14] qdev: add qdev_add_properties, Anthony Liguori, 2012/05/01
[Qemu-devel] [PATCH 05/14] qdev: use wrapper for qdev_get_path, Anthony Liguori, 2012/05/01
[Qemu-devel] [PATCH 14/14] qbus: initialize in standard way,
Anthony Liguori <=
[Qemu-devel] [PATCH 07/14] qdev: fix info qtree/qdm, Anthony Liguori, 2012/05/01
[Qemu-devel] [PATCH 12/14] qbus: move print_dev to DeviceClass, Anthony Liguori, 2012/05/01
[Qemu-devel] [PATCH 13/14] qbus: make child devices links, Anthony Liguori, 2012/05/01
[Qemu-devel] [PATCH 01/14] qdev: fix adding of ptr properties, Anthony Liguori, 2012/05/01
[Qemu-devel] [PATCH 09/14] qdev: connect some links and move type to object (v2), Anthony Liguori, 2012/05/01
[Qemu-devel] [PATCH 06/14] qdev: move properties from businfo to base class instance init, Anthony Liguori, 2012/05/01