summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc-André Lureau2020-01-10 16:30:30 +0100
committerPaolo Bonzini2020-01-24 20:59:14 +0100
commit9859facc0487b248217f7fe10aad8680be86b19f (patch)
tree0576ee93868400a05f17806af3f18da8405c51e5
parentobject: add object_class_property_add_link() (diff)
downloadqemu-9859facc0487b248217f7fe10aad8680be86b19f.tar.gz
qemu-9859facc0487b248217f7fe10aad8680be86b19f.tar.xz
qemu-9859facc0487b248217f7fe10aad8680be86b19f.zip
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>
-rw-r--r--qom/object.c21
1 files changed, 10 insertions, 11 deletions
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);