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
>
>

Reply via email to