On 18/11/2019 10:26, Markus Armbruster wrote: > Greg Kurz <gr...@kaod.org> writes: > >> 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. > > Have you looked for the pattern elsewhere?
I can take care of the Aspeed machine. I followed the same pattern there. C.