Message ID | 20201211220529.2290218-27-ehabkost@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qdev property code cleanup | expand |
On Fri, 11 Dec 2020 17:05:23 -0500 Eduardo Habkost <ehabkost@redhat.com> wrote: > qdev_class_add_property() and qdev_property_add_static() will > have code that's specific for device types. > > object_class_property_add_field_static() and > object_property_add_field() will be generic and part of the QOM > field property API. Note that the new functions have a `name` > parameter because the plan is to eventually get rid of the > Property.name field. > > The declarations for the new functions are being added to > qdev-properties-internal.h, but they will be moved to a QOM > header later. > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > --- > Changes v2 -> v3: > * Re-added array-based array registration function, named > as object_class_add_field_properties() > * Renamed object_class_property_add_field() to > object_class_property_add_field_static(), to indicate that > the function expect the Property argument to have static life > time. > * Keep all new functions as internal API by now, > until we decide what's going to be the preferred API for > registering class field properties. > > Changes v1 -> v2: > * Patch redone after changes in previous patches in the series > * Rename new functions to object*_property_add_field() > --- > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: "Daniel P. Berrangé" <berrange@redhat.com> > Cc: Eduardo Habkost <ehabkost@redhat.com> > Cc: qemu-devel@nongnu.org > --- > hw/core/qdev-prop-internal.h | 42 ++++++++++++++++++++++++++++++++++++ > hw/core/qdev-properties.c | 37 ++++++++++++++++++++++++------- > 2 files changed, 71 insertions(+), 8 deletions(-) > > diff --git a/hw/core/qdev-prop-internal.h b/hw/core/qdev-prop-internal.h > index d7b77844fe..6f17ddf271 100644 > --- a/hw/core/qdev-prop-internal.h > +++ b/hw/core/qdev-prop-internal.h > @@ -25,4 +25,46 @@ void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name, > void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name, > void *opaque, Error **errp); > > +/** > + * object_property_add_field: Add a field property to an object instance > + * @obj: object instance > + * @name: property name > + * @prop: property definition > + * > + * This function should not be used in new code. Please add class properties > + * instead, using object_class_add_field(). > + */ > +ObjectProperty * > +object_property_add_field(Object *obj, const char *name, > + Property *prop); > + > +/** > + * object_class_property_add_field_static: Add a field property to object class > + * @oc: object class > + * @name: property name > + * @prop: property definition > + * > + * Add a field property to an object class. A field property is > + * a property that will change a field at a specific offset of the > + * object instance struct. > + * > + * *@prop must have static life time. > + */ > +ObjectProperty * > +object_class_property_add_field_static(ObjectClass *oc, const char *name, > + Property *prop); > + > +/** > + * object_class_add_field_properties: Add field properties from array to a class > + * @oc: object class > + * @props: array of property definitions > + * > + * Register an array of field properties to a class, using > + * object_class_property_add_field_static() for each array element. > + * > + * The array at @props must end with DEFINE_PROP_END_OF_LIST(), and > + * must have static life time. > + */ > +void object_class_add_field_properties(ObjectClass *oc, Property *props); since it uses object_class_property_add_field_static() may be add _static suffix here as well? > + > #endif > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > index fcda0c8f4b..8436b60ec4 100644 > --- a/hw/core/qdev-properties.c > +++ b/hw/core/qdev-properties.c > @@ -835,20 +835,21 @@ const PropertyInfo qdev_prop_link = { > .create = create_link_property, > }; > > -void qdev_property_add_static(DeviceState *dev, Property *prop) > +ObjectProperty * > +object_property_add_field(Object *obj, const char *name, > + Property *prop) > { > - Object *obj = OBJECT(dev); > ObjectProperty *op; > > assert(!prop->info->create); > > - op = object_property_add(obj, prop->name, prop->info->name, > + op = object_property_add(obj, name, prop->info->name, > field_prop_getter(prop->info), > field_prop_setter(prop->info), > prop->info->release, > prop); > > - object_property_set_description(obj, prop->name, > + object_property_set_description(obj, name, > prop->info->description); > > if (prop->set_default) { > @@ -857,12 +858,14 @@ void qdev_property_add_static(DeviceState *dev, Property *prop) > op->init(obj, op); > } > } > + > + return op; > } > > -static void qdev_class_add_property(DeviceClass *klass, const char *name, > - Property *prop) > +ObjectProperty * > +object_class_property_add_field_static(ObjectClass *oc, const char *name, > + Property *prop) > { > - ObjectClass *oc = OBJECT_CLASS(klass); > ObjectProperty *op; > > if (prop->info->create) { > @@ -882,6 +885,22 @@ static void qdev_class_add_property(DeviceClass *klass, const char *name, > object_class_property_set_description(oc, name, > prop->info->description); > } > + return op; > +} > + > +void object_class_add_field_properties(ObjectClass *oc, Property *props) > +{ > + Property *prop; > + > + for (prop = props; prop && prop->name; prop++) { > + object_class_property_add_field_static(oc, prop->name, prop); > + } > +} > + > + > +void qdev_property_add_static(DeviceState *dev, Property *prop) > +{ > + object_property_add_field(OBJECT(dev), prop->name, prop); > } > > /** > @@ -932,13 +951,15 @@ static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop) > > void device_class_set_props(DeviceClass *dc, Property *props) > { > + ObjectClass *oc = OBJECT_CLASS(dc); > Property *prop; > > dc->props_ = props; > for (prop = props; prop && prop->name; prop++) { > qdev_class_add_legacy_property(dc, prop); > - qdev_class_add_property(dc, prop->name, prop); > } > + > + object_class_add_field_properties(oc, props); > } > > void qdev_alias_all_properties(DeviceState *target, Object *source)
diff --git a/hw/core/qdev-prop-internal.h b/hw/core/qdev-prop-internal.h index d7b77844fe..6f17ddf271 100644 --- a/hw/core/qdev-prop-internal.h +++ b/hw/core/qdev-prop-internal.h @@ -25,4 +25,46 @@ void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name, void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp); +/** + * object_property_add_field: Add a field property to an object instance + * @obj: object instance + * @name: property name + * @prop: property definition + * + * This function should not be used in new code. Please add class properties + * instead, using object_class_add_field(). + */ +ObjectProperty * +object_property_add_field(Object *obj, const char *name, + Property *prop); + +/** + * object_class_property_add_field_static: Add a field property to object class + * @oc: object class + * @name: property name + * @prop: property definition + * + * Add a field property to an object class. A field property is + * a property that will change a field at a specific offset of the + * object instance struct. + * + * *@prop must have static life time. + */ +ObjectProperty * +object_class_property_add_field_static(ObjectClass *oc, const char *name, + Property *prop); + +/** + * object_class_add_field_properties: Add field properties from array to a class + * @oc: object class + * @props: array of property definitions + * + * Register an array of field properties to a class, using + * object_class_property_add_field_static() for each array element. + * + * The array at @props must end with DEFINE_PROP_END_OF_LIST(), and + * must have static life time. + */ +void object_class_add_field_properties(ObjectClass *oc, Property *props); + #endif diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index fcda0c8f4b..8436b60ec4 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -835,20 +835,21 @@ const PropertyInfo qdev_prop_link = { .create = create_link_property, }; -void qdev_property_add_static(DeviceState *dev, Property *prop) +ObjectProperty * +object_property_add_field(Object *obj, const char *name, + Property *prop) { - Object *obj = OBJECT(dev); ObjectProperty *op; assert(!prop->info->create); - op = object_property_add(obj, prop->name, prop->info->name, + op = object_property_add(obj, name, prop->info->name, field_prop_getter(prop->info), field_prop_setter(prop->info), prop->info->release, prop); - object_property_set_description(obj, prop->name, + object_property_set_description(obj, name, prop->info->description); if (prop->set_default) { @@ -857,12 +858,14 @@ void qdev_property_add_static(DeviceState *dev, Property *prop) op->init(obj, op); } } + + return op; } -static void qdev_class_add_property(DeviceClass *klass, const char *name, - Property *prop) +ObjectProperty * +object_class_property_add_field_static(ObjectClass *oc, const char *name, + Property *prop) { - ObjectClass *oc = OBJECT_CLASS(klass); ObjectProperty *op; if (prop->info->create) { @@ -882,6 +885,22 @@ static void qdev_class_add_property(DeviceClass *klass, const char *name, object_class_property_set_description(oc, name, prop->info->description); } + return op; +} + +void object_class_add_field_properties(ObjectClass *oc, Property *props) +{ + Property *prop; + + for (prop = props; prop && prop->name; prop++) { + object_class_property_add_field_static(oc, prop->name, prop); + } +} + + +void qdev_property_add_static(DeviceState *dev, Property *prop) +{ + object_property_add_field(OBJECT(dev), prop->name, prop); } /** @@ -932,13 +951,15 @@ static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop) void device_class_set_props(DeviceClass *dc, Property *props) { + ObjectClass *oc = OBJECT_CLASS(dc); Property *prop; dc->props_ = props; for (prop = props; prop && prop->name; prop++) { qdev_class_add_legacy_property(dc, prop); - qdev_class_add_property(dc, prop->name, prop); } + + object_class_add_field_properties(oc, props); } void qdev_alias_all_properties(DeviceState *target, Object *source)
qdev_class_add_property() and qdev_property_add_static() will have code that's specific for device types. object_class_property_add_field_static() and object_property_add_field() will be generic and part of the QOM field property API. Note that the new functions have a `name` parameter because the plan is to eventually get rid of the Property.name field. The declarations for the new functions are being added to qdev-properties-internal.h, but they will be moved to a QOM header later. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- Changes v2 -> v3: * Re-added array-based array registration function, named as object_class_add_field_properties() * Renamed object_class_property_add_field() to object_class_property_add_field_static(), to indicate that the function expect the Property argument to have static life time. * Keep all new functions as internal API by now, until we decide what's going to be the preferred API for registering class field properties. Changes v1 -> v2: * Patch redone after changes in previous patches in the series * Rename new functions to object*_property_add_field() --- Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: "Daniel P. Berrangé" <berrange@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: qemu-devel@nongnu.org --- hw/core/qdev-prop-internal.h | 42 ++++++++++++++++++++++++++++++++++++ hw/core/qdev-properties.c | 37 ++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 8 deletions(-)