Why does this lack recursive realization? (I'm not top posting, I'm replying to the commit message. :))
Paolo Il 26/06/2012 00:43, Anthony Liguori ha scritto: > Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> > --- > hw/qdev.c | 36 +++++++++++++++++++++++++++++++++++- > 1 files changed, 35 insertions(+), 1 deletions(-) > > diff --git a/hw/qdev.c b/hw/qdev.c > index a6c4c02..d305128 100644 > --- a/hw/qdev.c > +++ b/hw/qdev.c > @@ -101,7 +101,6 @@ static void bus_add_child(BusState *bus, DeviceState > *child) > void qdev_set_parent_bus(DeviceState *dev, BusState *bus) > { > dev->parent_bus = bus; > - bus_add_child(bus, dev); > } > > /* Create a new device. This only initializes the device state structure > @@ -157,6 +156,10 @@ int qdev_init(DeviceState *dev) > > assert(dev->state == DEV_STATE_CREATED); > > + if (dev->parent_bus) { > + bus_add_child(dev->parent_bus, dev); > + } > + > rc = dc->init(dev); > if (rc < 0) { > object_unparent(OBJECT(dev)); > @@ -663,6 +666,33 @@ void qdev_property_add_static(DeviceState *dev, Property > *prop, > assert_no_error(local_err); > } > > +static bool qdev_prop_get_realized(Object *obj, Error **errp) > +{ > + DeviceState *dev = DEVICE(obj); > + > + return (dev->state == DEV_STATE_INITIALIZED); > +} > + > +static void qdev_prop_set_realized(Object *obj, bool value, Error **errp) > +{ > + DeviceState *dev = DEVICE(obj); > + bool realized = (dev->state == DEV_STATE_INITIALIZED); > + > + if (realized == value) { > + return; > + } > + > + if (realized && !value) { > + error_set(errp, QERR_PERMISSION_DENIED); > + return; > + } > + > + if (qdev_init(dev) < 0) { > + error_set(errp, QERR_DEVICE_INIT_FAILED, ""); > + return; > + } > +} > + > static void device_initfn(Object *obj) > { > DeviceState *dev = DEVICE(obj); > @@ -687,6 +717,10 @@ static void device_initfn(Object *obj) > } while (class != object_class_by_name(TYPE_DEVICE)); > qdev_prop_set_globals(dev); > > + object_property_add_bool(obj, "realized", > + qdev_prop_get_realized, qdev_prop_set_realized, > + NULL); > + > object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS, > (Object **)&dev->parent_bus, NULL); > } >