From: Alexander Barabash<address@hidden>
In the existing implementation, object_delete()
calls object_unref(), then frees the object's storage.
Running object_delete() on an object with reference count
different from 1 causes program failure.
In the existing implementation, object_unref()
finalizes the object when its reference count becomes 0.
In the new implementation, object_unref()
finalizes and frees the object's storage when the reference count becomes 0.
In the new implementation, object_delete()
just calls object_unref().
Running object_delete() on an object with reference count
different from 1 still causes program failure.
Signed-off-by: Alexander Barabash<address@hidden>
---
qom/object.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/qom/object.c b/qom/object.c
index e6591e1..8d36a9c 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -373,9 +373,8 @@ Object *object_new(const char *typename)
void object_delete(Object *obj)
{
+ g_assert(obj->ref == 1);
object_unref(obj);
- g_assert(obj->ref == 0);
- g_free(obj);
}
static bool type_is_ancestor(TypeImpl *type, TypeImpl *target_type)
@@ -585,6 +584,7 @@ void object_unref(Object *obj)
/* parent always holds a reference to its children */
if (obj->ref == 0) {
object_finalize(obj);
+ g_free(obj);
}
}