From: Alexander Barabash <alexander_barab...@mentor.com> 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 <alexander_barab...@mentor.com> --- 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); } } -- 1.7.5.4