From: Marc-André Lureau Date: Fri, 10 Jan 2020 15:30:30 +0000 (+0400) Subject: object: release all props X-Git-Tag: qemu-xen-4.14.0~177^2~12 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=9859facc0487b248217f7fe10aad8680be86b19f;p=qemu-xen.git object: release all props Class properties may have to release resources when the object is destroyed. Let's use the existing release() callback for that, but class properties must not release ObjectProperty, as it can be shared by various instances. Signed-off-by: Marc-André Lureau Message-Id: <20200110153039.1379601-18-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- diff --git a/qom/object.c b/qom/object.c index a3da546366..66c4a5f1cb 100644 --- a/qom/object.c +++ b/qom/object.c @@ -592,23 +592,22 @@ static inline bool object_property_is_child(ObjectProperty *prop) static void object_property_del_all(Object *obj) { + g_autoptr(GHashTable) done = g_hash_table_new(NULL, NULL); ObjectProperty *prop; - GHashTableIter iter; - gpointer key, value; + ObjectPropertyIterator iter; bool released; do { released = false; - g_hash_table_iter_init(&iter, obj->properties); - while (g_hash_table_iter_next(&iter, &key, &value)) { - prop = value; - if (prop->release) { - prop->release(obj, prop->name, prop->opaque); - prop->release = NULL; - released = true; - break; + 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; + } } - g_hash_table_iter_remove(&iter); } } while (released);