Message ID | 1340664222-25098-3-git-send-email-aliguori@us.ibm.com |
---|---|
State | New |
Headers | show |
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 <aliguori@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); > } >
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); }
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> --- hw/qdev.c | 36 +++++++++++++++++++++++++++++++++++- 1 files changed, 35 insertions(+), 1 deletions(-)