On Fri, Nov 15, 2019 at 04:55:21PM +0100, Greg Kurz wrote: > There's a recurring pattern in the code where a const link is added to a > newly instanciated object and the link is then used in the object's realize > function to keep a pointer to the QOM entity which the link points to. > > void create_obj_b(Object *obj_a) > { > Object *obj_b; > > obj_b = object_new(TYPE_B); > object_property_add_const_link(obj_b, "link-to-a", obj_a, &error_abort); > object_property_set_bool(obj_b, true, "realized", &error_abort); > } > > void object_b_realize(DeviceState *dev, Error **errp) > { > Object *obj_a; > > obj_a = object_property_get_link(OBJECT(dev), "link-to-a", errp); > if (!obj_a) { > return; > } > > obj_b->obj_a = A(obj_a); // If obj_b->obj_a is changed, the link property > // still points to the original obj_a that was > // passed to object_property_add_const_link() > } > > Confusing bugs could arise if the pointer and the link go out of sync for > some reason. This can be avoided if the property is defined to directly use > the pointer with the DEFINE_PROP_LINK() macro. > > This series just does that for all occurences of the fragile pattern in > the XIVE and PNV code. > > Changes in v2: > - use DEFINE_PROP_LINK() instead of object_property_add_link() > - dropped public -> private changes in type definitions Applied to ppc-for-5.0. -- 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