On 02/22/2012 12:00 PM, alexander_barab...@mentor.com wrote:
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.

This isn't correct.  QOM objects don't necessarily have heap allocated objects.

I've been thinking about this general problem and I think the right way to solve it is to have a delete notifier list. That way, object_new() can register a delete notifier that calls g_free() whenever refcount=0. That way an explicit object_delete() isn't needed anymore.

Although I think we should keep the call around as it's convenient for replacing occurrences of qdev_free() where you really want the assert.

Regards,

Anthony Liguori


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



Reply via email to