Replace object_delete() with object_unref().
PATCH 1/1 Replace object_delete() with object_unref().
Replace object_delete() with object_unref().
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 one (1) causes program failure.
In the existing implementation, object_unref() finalizes the object when its reference count becomes zero (0).
In the new implementation, object_unref()
finalizes and frees the object's storage when the reference count
becomes zero (0).
One usage of object_delete() replaced by object_unref().
hw/qdev.c +1 -1
@@ -247,7 +247,7 @@ void qdev_init_nofail(DeviceState *dev)/* Unlink device from bus and free the structure. */ void qdev_free (DeviceState *dev) { -object_delete (OBJECT (dev)); +object_unref (OBJECT (dev)); }void qdev_machine_creation_done (void )
include/qemu/object.h +9 -14
@@ -415,8 +415,9 @@ struct InterfaceInfo* object_new: * @typename: The name of the type of the object to instantiate. * -* This function will initialize a new object using heap allocated memory. This -* function should be paired with object_delete() to free the resources +* This function will initialize a new object using heap allocated memory. +* The object's reference count will be set to one (1) upon successful completion. +* This function should be paired with object_unref() to free the resources * associated with the object. * * Returns: The newly allocated and instantiated object.
@@ -427,8 +428,9 @@ Object *object_new(const char *typename);* object_new_with_type: * @type: The type of the object to instantiate. * -* This function will initialize a new object using heap allocated memory. This -* function should be paired with object_delete() to free the resources +* This function will initialize a new object using heap allocated memory. +* The object's reference count will be set to one (1) upon successful completion. +* This function should be paired with object_unref() to free the resources * associated with the object. * * Returns: The newly allocated and instantiated object.
@@ -436,15 +438,6 @@ Object *object_new(const char *typename);Object *object_new_with_type (Type type);/** -* object_delete: -* @obj: The object to free. -* -* Finalize an object and then free the memory associated with it. This should -* be paired with object_new() to free the resources associated with an object. -*/ -void object_delete (Object *obj); - -/** * object_initialize_with_type: * @obj: A pointer to the memory to be used for the object. * @type: The type of the object to instantiate.
@@ -573,8 +566,10 @@ void object_ref(Object *obj);* qdef_unref: * @obj: the object * -* Decrease the reference count of a object. A object cannot be freed as long +* Decrease the reference count of a object. A object is not freed as long * as its reference count is greater than zero. +* Once an object's reference count gets to zero (0), +* the object is finalized and the memory associated with it is freed. */ void object_unref (Object *obj);
qom/object.c +0 -0
@@ -328,7 +328,7 @@ static void object_deinit(Object *obj, TypeImpl *type)while (obj->interfaces) {Interface *iface_obj = obj->interfaces->data; obj->interfaces = g_slist_delete_link(obj->interfaces,
obj->interfaces);
- object_delete(OBJECT(iface_obj));
+ object_unref(OBJECT(iface_obj));
}
if (type_has_parent(type)) {
@@ -369,13 +369,6 @@ Object *object_new(const char *typename)
return object_new_with_type(ti);}
-void object_delete(Object *obj)
-{
- object_unref(obj);
- g_assert(obj->ref == 0);
- g_free(obj);
-}
-
static bool type_is_ancestor(TypeImpl *type, TypeImpl *target_type)
{
assert(target_type);
@@ -583,6 +576,7 @@ void object_unref(Object *obj)
/* parent always holds a reference to its children */
if (obj->ref == 0) {
object_finalize(obj);
+ g_free(obj);
}}
Object model lifecycle changes aren't trivial IMHO. [no comment on actual patch contents implied]
-- PMM
Quoted 133 lines · Alexander Barabash
Replace
object_delete()withobject_unref().In the existing implementation,
object_delete()callsobject_unref(), then frees the object's storage. Runningobject_delete()on an object with reference count different from one (1) causes program failure.In the existing implementation,
object_unref()finalizes the object when its reference count becomes zero (0).In the new implementation,
object_unref()
finalizes and frees the object's storage when the reference count becomes zero (0).One usage of
object_delete()replaced byobject_unref().Signed-off-by Alexander Barabash <[email protected]>hw/qdev.c +1
-1@@ -247,7 +247,7 @@ void qdev_init_nofail(DeviceState *dev) /* Unlink device from bus and free the structure. */ void qdev_free(DeviceState *dev) { - object_delete(OBJECT(dev)); + object_unref(OBJECT(dev)); } void qdev_machine_creation_done(void)include/qemu/object.h +0
-1@@ -415,8 +415,9 @@ struct InterfaceInfo * object_new: * @typename: The name of the type of the object to instantiate. * - * This function will initialize a new object using heap allocated memory.This
- * function should be paired withobject_delete()to free the resources
+ * This function will initialize a new object using heap allocated memory.
+ * The object's reference count will be set to one (1) upon successful completion.
+ * This function should be paired withobject_unref()to free the resources
* associated with the object.
*
* Returns: The newly allocated and instantiated object.include/qemu/object.h +0
-1@@ -427,8 +428,9 @@ Object *object_new(const char *typename); * object_new_with_type: * @type: The type of the object to instantiate. * - * This function will initialize a new object using heap allocated memory.This
- * function should be paired withobject_delete()to free the resources
+ * This function will initialize a new object using heap allocated memory.
+ * The object's reference count will be set to one (1) upon successful completion.
+ * This function should be paired withobject_unref()to free the resources
* associated with the object.
*
* Returns: The newly allocated and instantiated object.include/qemu/object.h +0
-4@@ -436,15 +438,6 @@ Object *object_new(const char *typename); Object *object_new_with_type(Type type); /** -* object_delete: -* @obj: The object to free. -* -* Finalize an object and then free the memory associated with it. This should
- * be paired withobject_new()to free the resources associated with an object.
- */include/qemu/object.h +0
-3-void object_delete (Object *obj); - -/** *
object_initialize_with_type:
* @obj: A pointer to the memory to be used for the object.
* @type: The type of the object to instantiate.include/qemu/object.h +0
-1@@ -573,8 +566,10 @@ void object_ref(Object *obj); * qdef_unref: * @obj: the object * - * Decrease the reference count of a object. A object cannot be freed aslong
+ * Decrease the reference count of a object. A object is not freed as long
* as its reference count is greater than zero.
+ * Once an object's reference count gets to zero (0),
+ * the object is finalized and the memory associated with it is freed. */
voidobject_unref(Object *obj);qom/object.c +1
-1@@ -328,7 +328,7 @@ static void object_deinit(Object *obj, TypeImpl *type) while (obj->interfaces) { Interface *iface_obj = obj->interfaces->data; obj->interfaces = g_slist_delete_link(obj->interfaces, obj->interfaces); - object_delete(OBJECT(iface_obj)); + object_unref(OBJECT(iface_obj)); }if (
type_has_parent(type)) {qom/object.c +1
-7@@ -369,13 +369,6 @@ Object *object_new(const char *typename) return object_new_with_type(ti); } -void object_delete (Object *obj) -{ - object_unref(obj); - g_assert(obj->ref == 0); - g_free(obj); -} - static bool type_is_ancestor(TypeImpl *type, TypeImpl *target_type) { assert(target_type);@@ -583,6 +576,7 @@ void object_unref(Object *obj) /* parent always holds a reference to its children */ if (obj->ref == 0) { object_finalize(obj); + g_free(obj); } }
Quoted 2 lines · Peter Maydell
Object model lifecycle changes aren't trivial IMHO. [no comment on actual patch contents implied]
Agreed.
Stefan