[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/9] object: automatically free objects based on a r
From: |
Anthony Liguori |
Subject: |
[Qemu-devel] [PATCH 2/9] object: automatically free objects based on a release function |
Date: |
Sun, 26 Aug 2012 10:51:31 -0500 |
Now object_delete() simply has the semantics of unref'ing an object and
unparenting it.
Signed-off-by: Anthony Liguori <address@hidden>
---
include/qemu/object.h | 5 +++++
qom/object.c | 16 +++++++++++++++-
2 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/include/qemu/object.h b/include/qemu/object.h
index cc75fee..487adcd 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -242,6 +242,8 @@ struct ObjectClass
GSList *interfaces;
};
+typedef void (ObjectReleaseFunc)(Object *obj);
+
/**
* Object:
*
@@ -264,6 +266,7 @@ struct Object
QTAILQ_HEAD(, ObjectProperty) properties;
uint32_t ref;
Object *parent;
+ ObjectReleaseFunc *release;
};
/**
@@ -464,6 +467,8 @@ Object *object_new_with_type(Type type);
*/
void object_delete(Object *obj);
+void object_set_release_func(Object *obj, ObjectReleaseFunc *func);
+
/**
* object_initialize_with_type:
* @obj: A pointer to the memory to be used for the object.
diff --git a/qom/object.c b/qom/object.c
index e3e9242..44135c3 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -384,6 +384,20 @@ void object_finalize(void *data)
object_property_del_all(obj);
g_assert(obj->ref == 0);
+
+ if (obj->release) {
+ obj->release(obj);
+ }
+}
+
+void object_set_release_func(Object *obj, ObjectReleaseFunc *func)
+{
+ obj->release = func;
+}
+
+static void object_release_func(Object *obj)
+{
+ g_free(obj);
}
Object *object_new_with_type(Type type)
@@ -395,6 +409,7 @@ Object *object_new_with_type(Type type)
obj = g_malloc(type->instance_size);
object_initialize_with_type(obj, type);
+ object_set_release_func(obj, object_release_func);
object_ref(obj);
return obj;
@@ -412,7 +427,6 @@ void object_delete(Object *obj)
object_unparent(obj);
g_assert(obj->ref == 1);
object_unref(obj);
- g_free(obj);
}
Object *object_dynamic_cast(Object *obj, const char *typename)
--
1.7.5.4
- [Qemu-devel] [RFC PATCH 0/9] qom: improve reference counting and hotplug, Anthony Liguori, 2012/08/26
- [Qemu-devel] [PATCH 1/9] savevm: don't rely on paths if we can store a DeviceState object, Anthony Liguori, 2012/08/26
- [Qemu-devel] [PATCH 6/9] qdev: make devices created with device_add nullable so they can be deleted, Anthony Liguori, 2012/08/26
- [Qemu-devel] [PATCH 4/9] object: remove object_finalize, Anthony Liguori, 2012/08/26
- [Qemu-devel] [PATCH 7/9] qdev: add notifier for when the device loses its parent bus (eject), Anthony Liguori, 2012/08/26
- [Qemu-devel] [PATCH 2/9] object: automatically free objects based on a release function,
Anthony Liguori <=
- [Qemu-devel] [PATCH 8/9] qdev: make qdev_set_parent_bus() just set a link property, Anthony Liguori, 2012/08/26
- [Qemu-devel] [PATCH 9/9] hotplug: refactor hotplug to leverage new QOM functions, Anthony Liguori, 2012/08/26
- [Qemu-devel] [PATCH 3/9] qbus: remove glib_allocated/qom_allocated and use release hook to free memory, Anthony Liguori, 2012/08/26