@@ -66,6 +66,15 @@ typedef void FieldAccessor(Object *obj, Visitor *v,
const char *name, Property *prop,
Error **errp);
+/**
+ * typedef FieldRelease:
+ * @obj: the object instance
+ * @name: the name of the property
+ * @prop: Field property definition
+ */
+typedef void FieldRelease(Object *obj, const char *name, Property *prop);
+
+
/**
* struct PropertyInfo: information on a specific QOM property type
*/
@@ -91,7 +100,7 @@ struct PropertyInfo {
* @release: Optional release function, called when the object
* is destroyed
*/
- ObjectPropertyRelease *release;
+ FieldRelease *release;
};
/**
@@ -63,9 +63,8 @@ static void set_tpm(Object *obj, Visitor *v, const char *name,
g_free(str);
}
-static void release_tpm(Object *obj, const char *name, void *opaque)
+static void release_tpm(Object *obj, const char *name, Property *prop)
{
- Property *prop = opaque;
TPMBackend **be = object_field_prop_ptr(obj, prop);
if (*be) {
@@ -176,10 +176,9 @@ static void set_drive_iothread(Object *obj, Visitor *v, const char *name,
set_drive_helper(obj, v, name, prop, true, errp);
}
-static void release_drive(Object *obj, const char *name, void *opaque)
+static void release_drive(Object *obj, const char *name, Property *prop)
{
DeviceState *dev = DEVICE(obj);
- Property *prop = opaque;
BlockBackend **ptr = object_field_prop_ptr(obj, prop);
if (*ptr) {
@@ -257,9 +256,8 @@ static void set_chr(Object *obj, Visitor *v, const char *name,
g_free(str);
}
-static void release_chr(Object *obj, const char *name, void *opaque)
+static void release_chr(Object *obj, const char *name, Property *prop)
{
- Property *prop = opaque;
CharBackend *be = object_field_prop_ptr(obj, prop);
qemu_chr_fe_deinit(be, false);
@@ -47,6 +47,15 @@ static ObjectPropertyAccessor *field_prop_setter(const PropertyInfo *info)
return info->set ? field_prop_set : NULL;
}
+static void field_prop_release(Object *obj, const char *name, void *opaque)
+{
+ Property *prop = opaque;
+ if (prop->info->release) {
+ prop->info->release(obj, name, prop);
+ }
+}
+
+
ObjectProperty *
object_property_add_field(Object *obj, const char *name, Property *prop,
ObjectPropertyAllowSet allow_set)
@@ -59,7 +68,7 @@ object_property_add_field(Object *obj, const char *name, Property *prop,
op = object_property_add(obj, name, prop->info->name,
field_prop_getter(prop->info),
field_prop_setter(prop->info),
- prop->info->release,
+ field_prop_release,
prop);
object_property_set_description(obj, name,
@@ -92,7 +101,7 @@ object_class_property_add_field(ObjectClass *oc, const char *name,
name, prop->info->name,
field_prop_getter(prop->info),
field_prop_setter(prop->info),
- prop->info->release,
+ field_prop_release,
prop);
}
if (prop->set_default) {
@@ -321,9 +321,8 @@ const PropertyInfo prop_info_int64 = {
/* --- string --- */
-static void release_string(Object *obj, const char *name, void *opaque)
+static void release_string(Object *obj, const char *name, Property *prop)
{
- Property *prop = opaque;
g_free(*(char **)object_field_prop_ptr(obj, prop));
}
The release function must interpret the third argument as Property*. Change the signature of PropertyInfo.release to indicate that. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- Cc: Stefan Berger <stefanb@linux.vnet.ibm.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: "Daniel P. Berrangé" <berrange@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: qemu-devel@nongnu.org --- include/qom/field-property.h | 11 ++++++++++- backends/tpm/tpm_util.c | 3 +-- hw/core/qdev-properties-system.c | 6 ++---- qom/field-property.c | 13 +++++++++++-- qom/property-types.c | 3 +-- 5 files changed, 25 insertions(+), 11 deletions(-)