On Tue, May 07, 2019 at 06:34:02PM +0200, Philippe Mathieu-Daudé wrote: > As explained in commit aff39be0ed97: > > Both functions, object_initialize() and object_property_add_child() > increase the reference counter of the new object, so one of the > references has to be dropped afterwards to get the reference > counting right. Otherwise the child object will not be properly > cleaned up when the parent gets destroyed. > Thus let's use now object_initialize_child() instead to get the > reference counting here right. > > This patch was generated using the following Coccinelle script > (with a bit of manual fix-up for overly long lines): > > @use_object_initialize_child@ > expression parent_obj; > expression child_ptr; > expression child_name; > expression child_type; > expression child_size; > expression errp; > @@ > ( > - object_initialize(child_ptr, child_size, child_type); > + object_initialize_child(parent_obj, child_name, child_ptr, child_size, > + child_type, &error_abort, NULL); > ... when != parent_obj > - object_property_add_child(parent_obj, child_name, OBJECT(child_ptr), > NULL); > ... > ?- object_unref(OBJECT(child_ptr)); > | > - object_initialize(child_ptr, child_size, child_type); > + object_initialize_child(parent_obj, child_name, child_ptr, child_size, > + child_type, errp, NULL); > ... when != parent_obj > - object_property_add_child(parent_obj, child_name, OBJECT(child_ptr), > errp); > ... > ?- object_unref(OBJECT(child_ptr)); > ) > > While the object_initialize() function doesn't take an > 'Error *errp' argument, the object_initialize_child() does. > Since this code is used when a machine is created (and is not > yet running), we deliberately choose to use the &error_abort > argument instead of ignoring errors if an object creation failed. > > Suggested-by: Eduardo Habkost <ehabk...@redhat.com> > Inspired-by: Thomas Huth <th...@redhat.com> > Signed-off-by: Philippe Mathieu-Daudé <phi...@redhat.com>
Acked-by: David Gibson <da...@gibson.dropbear.id.au> > --- > hw/misc/macio/macio.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c > index 94da85c8d7d..b726c73022c 100644 > --- a/hw/misc/macio/macio.c > +++ b/hw/misc/macio/macio.c > @@ -346,12 +346,12 @@ static void macio_newworld_realize(PCIDevice *d, Error > **errp) > object_property_set_bool(OBJECT(&ns->gpio), true, "realized", &err); > > /* PMU */ > - object_initialize(&s->pmu, sizeof(s->pmu), TYPE_VIA_PMU); > + object_initialize_child(OBJECT(s), "pmu", &s->pmu, sizeof(s->pmu), > + TYPE_VIA_PMU, &error_abort, NULL); > object_property_set_link(OBJECT(&s->pmu), OBJECT(sysbus_dev), "gpio", > &error_abort); > qdev_prop_set_bit(DEVICE(&s->pmu), "has-adb", ns->has_adb); > qdev_set_parent_bus(DEVICE(&s->pmu), BUS(&s->macio_bus)); > - object_property_add_child(OBJECT(s), "pmu", OBJECT(&s->pmu), NULL); > > object_property_set_bool(OBJECT(&s->pmu), true, "realized", &err); > if (err) { > @@ -365,9 +365,9 @@ static void macio_newworld_realize(PCIDevice *d, Error > **errp) > sysbus_mmio_get_region(sysbus_dev, 0)); > } else { > /* CUDA */ > - object_initialize(&s->cuda, sizeof(s->cuda), TYPE_CUDA); > + object_initialize_child(OBJECT(s), "cuda", &s->cuda, sizeof(s->cuda), > + TYPE_CUDA, &error_abort, NULL); > qdev_set_parent_bus(DEVICE(&s->cuda), BUS(&s->macio_bus)); > - object_property_add_child(OBJECT(s), "cuda", OBJECT(&s->cuda), NULL); > qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency", > s->frequency); > -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature