qdev: let QOM free properties
Drop the special free callback. Instead, register a "regular" release method in the non-legacy property. Reviewed-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7b009e5d09
commit
dd0ba250ca
@ -510,9 +510,10 @@ PropertyInfo qdev_prop_hex64 = {
|
||||
|
||||
/* --- string --- */
|
||||
|
||||
static void free_string(DeviceState *dev, Property *prop)
|
||||
static void release_string(Object *obj, const char *name, void *opaque)
|
||||
{
|
||||
g_free(*(char **)qdev_get_prop_ptr(dev, prop));
|
||||
Property *prop = opaque;
|
||||
g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));
|
||||
}
|
||||
|
||||
static int print_string(DeviceState *dev, Property *prop, char *dest, size_t len)
|
||||
@ -572,7 +573,7 @@ PropertyInfo qdev_prop_string = {
|
||||
.type = PROP_TYPE_STRING,
|
||||
.size = sizeof(char*),
|
||||
.print = print_string,
|
||||
.free = free_string,
|
||||
.release = release_string,
|
||||
.get = get_string,
|
||||
.set = set_string,
|
||||
};
|
||||
@ -592,8 +593,10 @@ static int parse_drive(DeviceState *dev, const char *str, void **ptr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void free_drive(DeviceState *dev, Property *prop)
|
||||
static void release_drive(Object *obj, const char *name, void *opaque)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
|
||||
|
||||
if (*ptr) {
|
||||
@ -667,7 +670,7 @@ PropertyInfo qdev_prop_drive = {
|
||||
.size = sizeof(BlockDriverState *),
|
||||
.get = get_drive,
|
||||
.set = set_drive,
|
||||
.free = free_drive,
|
||||
.release = release_drive,
|
||||
};
|
||||
|
||||
/* --- character device --- */
|
||||
@ -686,8 +689,10 @@ static int parse_chr(DeviceState *dev, const char *str, void **ptr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void free_chr(DeviceState *dev, Property *prop)
|
||||
static void release_chr(Object *obj, const char *name, void *opaque)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
|
||||
|
||||
if (*ptr) {
|
||||
@ -721,7 +726,7 @@ PropertyInfo qdev_prop_chr = {
|
||||
.size = sizeof(CharDriverState*),
|
||||
.get = get_chr,
|
||||
.set = set_chr,
|
||||
.free = free_chr,
|
||||
.release = release_chr,
|
||||
};
|
||||
|
||||
/* --- netdev device --- */
|
||||
|
@ -595,7 +595,7 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
|
||||
|
||||
object_property_add(OBJECT(dev), prop->name, prop->info->name,
|
||||
prop->info->get, prop->info->set,
|
||||
NULL,
|
||||
prop->info->release,
|
||||
prop, errp);
|
||||
}
|
||||
|
||||
@ -626,7 +626,6 @@ static void device_finalize(Object *obj)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
BusState *bus;
|
||||
Property *prop;
|
||||
DeviceClass *dc = DEVICE_GET_CLASS(dev);
|
||||
|
||||
if (dev->state == DEV_STATE_INITIALIZED) {
|
||||
@ -645,11 +644,6 @@ static void device_finalize(Object *obj)
|
||||
}
|
||||
}
|
||||
QTAILQ_REMOVE(&dev->parent_bus->children, dev, sibling);
|
||||
for (prop = qdev_get_props(dev); prop && prop->name; prop++) {
|
||||
if (prop->info->free) {
|
||||
prop->info->free(dev, prop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void device_reset(DeviceState *dev)
|
||||
|
@ -145,9 +145,9 @@ struct PropertyInfo {
|
||||
int64_t max;
|
||||
int (*parse)(DeviceState *dev, Property *prop, const char *str);
|
||||
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
|
||||
void (*free)(DeviceState *dev, Property *prop);
|
||||
ObjectPropertyAccessor *get;
|
||||
ObjectPropertyAccessor *set;
|
||||
ObjectPropertyRelease *release;
|
||||
};
|
||||
|
||||
typedef struct GlobalProperty {
|
||||
|
Loading…
x
Reference in New Issue
Block a user