mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
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:
parent
840ecdfbf9
commit
9859facc04
1 changed files with 10 additions and 11 deletions
21
qom/object.c
21
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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue