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 <marcandre.lureau@redhat.com>
Message-Id: <20200110153039.1379601-18-marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Marc-André Lureau 2020-01-10 19:30:30 +04:00 committed by Paolo Bonzini
parent 840ecdfbf9
commit 9859facc04
1 changed files with 10 additions and 11 deletions

View File

@ -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);