Il mar 29 apr 2025, 16:03 <marcandre.lur...@redhat.com> ha scritto: > From: Marc-André Lureau <marcandre.lur...@redhat.com> > > Since commit 9859fac ("object: release all props"), the code was changed > to tracks the already released properties in a hash table. I am not sure > why this was done, perhaps to prevent from potential crashes if > properties are being added dynamically during release. I am not sure if > it's a valid concern though. >
You always need object_property_iter_init in case prop->release deletes a property, thus invalidating the GHashTable iterator. The hash table instead is needed in case prop->release does *not* delete a property, because then the property reappears on subsequent recreations of the iterator. Paolo > - bool released; > > - do { > - released = false; > - object_property_iter_init(&iter, obj); > - while ((prop = object_property_iter_next(&iter)) != NULL) { > - if (g_hash_table_add(done, prop)) { > - if (prop->release) { > - prop->release(obj, prop->name, prop->opaque); > - released = true; > - break; > - } > - } > + object_property_iter_init(&iter, obj); > + while ((prop = object_property_iter_next(&iter)) != NULL) { > + if (prop->release) { > + prop->release(obj, prop->name, prop->opaque); > } > - } while (released); > + } > > g_hash_table_unref(obj->properties); > } > -- > 2.49.0 > >