From: Markus Armbruster <armbru@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: qemu-devel@nongnu.org, "Igor Mammedov" <imammedo@redhat.com>,
"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH v4 5/8] qdev: Register static properties as class properties
Date: Fri, 04 Nov 2016 16:22:40 +0100 [thread overview]
Message-ID: <87ins35kxr.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <1477705687-31175-6-git-send-email-ehabkost@redhat.com> (Eduardo Habkost's message of "Fri, 28 Oct 2016 23:48:04 -0200")
Eduardo Habkost <ehabkost@redhat.com> writes:
> Instead of registering qdev static properties on instance_init,
> register them as class properties, at qdev_class_set_props().
>
> qdev_property_add_legacy() was replaced by an equivalent
> qdev_class_property_add_legacy() function.
> qdev_property_add_static(), on the other hand, can't be
> eliminated yet because it is used by arm_cpu_post_init().
>
> As class properties don't have a release function called when an
> object instance is destroyed, the release functions for
> properties are called manually from device_finalize().
Ignorant question: should class properties have such a release function?
Hmm, I see object_class_property_add() does take a release(). Is that
one called at the wrong time?
One typo noted below.
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> Changes series v1 -> v2:
> * (none)
>
> Changes v2 -> v3:
> * Fix code alignemnt
> * Reported-by: Igor Mammedov <imammedo@redhat.com>
>
> Changes series v3 -> v4:
> * s/Device/Class/ on qdev_class_property_add_legacy() doc comment
> * Reported-by: Igor Mammedov <imammedo@redhat.com>
> * Call prop->info->release on instance_finalize (fix
> tests/drive_del-test failure)
> ---
> hw/core/qdev.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 69 insertions(+), 13 deletions(-)
>
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 85952e8..e695fa8 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -739,12 +739,12 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v,
> }
>
> /**
> - * qdev_property_add_legacy:
> - * @dev: Device to add the property to.
> + * qdev_class_property_add_legacy:
> + * @oc: Class to add the property to.
> * @prop: The qdev property definition.
> * @errp: location to store error information.
> *
> - * Add a legacy QOM property to @dev for qdev property @prop.
> + * Add a legacy QOM property to @oc for qdev property @prop.
> * On error, store error in @errp.
> *
> * Legacy properties are string versions of QOM properties. The format of
> @@ -754,8 +754,8 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v,
> * Do not use this is new code! QOM Properties added through this interface
> * will be given names in the "legacy" namespace.
> */
> -static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
> - Error **errp)
> +static void qdev_class_property_add_legacy(ObjectClass *oc, Property *prop,
> + Error **errp)
> {
> gchar *name;
>
> @@ -765,11 +765,12 @@ static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
> }
>
> name = g_strdup_printf("legacy-%s", prop->name);
> - object_property_add(OBJECT(dev), name, "str",
> - prop->info->print ? qdev_get_legacy_property : prop->info->get,
> - NULL,
> - NULL,
> - prop, errp);
> + object_class_property_add(oc, name, "str",
> + prop->info->print ?
> + qdev_get_legacy_property :
> + prop->info->get,
> + NULL, NULL,
> + prop, errp);
>
> g_free(name);
> }
> @@ -844,6 +845,48 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
> qdev_property_set_to_default(dev, prop, &error_abort);
> }
>
> +/**
> + * qdev_class_property_add_static:
> + * @oc: Class to add the property to.
> + * @prop: The qdev property definition.
> + * @errp: location to store error information.
> + *
> + * Add a static QOM property to @oc for qdev property @prop.
> + * On error, store error in @errp. Static properties access data in a struct.
> + * The type of the QOM property is derived from prop->info.
> + */
> +static void qdev_class_property_add_static(ObjectClass *oc, Property *prop,
> + Error **errp)
> +{
> + Error *local_err = NULL;
> +
> + /*
> + * TODO qdev_prop_ptr does not have getters or setters. It must
> + * go now that it can be replaced with links. The test should be
> + * removed along with it: all static properties are read/write.
> + */
> + if (!prop->info->get && !prop->info->set) {
> + return;
> + }
> +
> + /* Note: prop->info->release is called on device_finalize(),
> + * because it needs to be called on instaqnce destruction, not on
instance
> + * class property removal.
> + */
> + object_class_property_add(oc, prop->name, prop->info->name,
> + prop->info->get, prop->info->set,
> + NULL, prop, &local_err);
> +
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> +
> + object_class_property_set_description(oc, prop->name,
> + prop->info->description,
> + &error_abort);
> +}
> +
> /* @qdev_alias_all_properties - Add alias properties to the source object for
> * all qdev properties on the target DeviceState.
> */
> @@ -867,8 +910,15 @@ void qdev_alias_all_properties(DeviceState *target, Object *source)
>
> void device_class_set_props(DeviceClass *dc, Property *props)
> {
> + Property *prop;
> + ObjectClass *oc = OBJECT_CLASS(dc);
> +
> assert(!dc->props);
> dc->props = props;
> + for (prop = dc->props; prop && prop->name; prop++) {
> + qdev_class_property_add_legacy(oc, prop, &error_abort);
> + qdev_class_property_add_static(oc, prop, &error_abort);
> + }
> }
>
> static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
> @@ -1068,8 +1118,7 @@ static void device_initfn(Object *obj)
> class = object_get_class(OBJECT(dev));
> do {
> for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
> - qdev_property_add_legacy(dev, prop, &error_abort);
> - qdev_property_add_static(dev, prop, &error_abort);
> + qdev_property_set_to_default(dev, prop, &error_abort);
> }
> class = object_class_get_parent(class);
> } while (class != object_class_by_name(TYPE_DEVICE));
> @@ -1088,9 +1137,16 @@ static void device_post_init(Object *obj)
> /* Unlink device from bus and free the structure. */
> static void device_finalize(Object *obj)
> {
> + DeviceState *dev = DEVICE(obj);
> + DeviceClass *dc = DEVICE_GET_CLASS(dev);
> + Property *prop;
> NamedGPIOList *ngl, *next;
>
> - DeviceState *dev = DEVICE(obj);
> + for (prop = dc->props; prop && prop->name; prop++) {
> + if (prop->info->release) {
> + prop->info->release(obj, prop->name, prop);
> + }
> + }
>
> QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) {
> QLIST_REMOVE(ngl, node);
next prev parent reply other threads:[~2016-11-04 15:22 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-29 1:47 [Qemu-devel] [PATCH v4 0/8] qdev class properties + abstract class support on device-list-properties Eduardo Habkost
2016-10-29 1:48 ` [Qemu-devel] [PATCH v4 1/8] tests: check-qom-proplist: Remove duplicate "bv" property Eduardo Habkost
2016-11-04 11:22 ` Markus Armbruster
2016-11-04 15:10 ` Markus Armbruster
2016-11-04 15:56 ` Andreas Färber
2016-11-04 16:07 ` Eduardo Habkost
2016-11-04 16:11 ` Andreas Färber
2016-10-29 1:48 ` [Qemu-devel] [PATCH v4 2/8] tests: check-qom-proplist: Use &error_abort to catch errors Eduardo Habkost
2016-10-31 10:14 ` Igor Mammedov
2016-10-29 1:48 ` [Qemu-devel] [PATCH v4 3/8] qdev: device_class_set_props() function Eduardo Habkost
2016-11-01 15:02 ` Igor Mammedov
2016-10-29 1:48 ` [Qemu-devel] [PATCH v4 4/8] qdev: Extract property-default code to qdev_property_set_to_default() Eduardo Habkost
2016-10-29 1:48 ` [Qemu-devel] [PATCH v4 5/8] qdev: Register static properties as class properties Eduardo Habkost
2016-10-31 12:06 ` Igor Mammedov
2016-11-04 15:22 ` Markus Armbruster [this message]
2016-11-04 16:00 ` Eduardo Habkost
2016-10-29 1:48 ` [Qemu-devel] [PATCH v4 6/8] qom: object_class_property_iter_init() function Eduardo Habkost
2016-10-31 13:45 ` Igor Mammedov
2016-11-04 15:31 ` Markus Armbruster
2016-10-29 1:48 ` [Qemu-devel] [PATCH v4 7/8] qmp: Support abstract classes on device-list-properties Eduardo Habkost
2016-10-31 14:07 ` Igor Mammedov
2016-10-31 14:36 ` Eduardo Habkost
2016-11-04 15:45 ` Markus Armbruster
2016-11-04 16:04 ` Eduardo Habkost
2016-11-07 8:09 ` Markus Armbruster
2016-11-07 12:38 ` Eduardo Habkost
2016-11-07 14:40 ` Markus Armbruster
2016-11-07 17:11 ` Eduardo Habkost
2016-11-08 7:29 ` Markus Armbruster
2016-11-11 12:17 ` Jiri Denemark
2016-11-11 12:34 ` Eduardo Habkost
2016-11-11 14:29 ` Markus Armbruster
2016-11-07 12:45 ` Halil Pasic
2016-11-07 13:05 ` Eduardo Habkost
2016-11-07 14:48 ` Halil Pasic
2016-11-07 15:01 ` Daniel P. Berrange
2016-11-07 15:51 ` Markus Armbruster
2016-11-07 17:27 ` Eduardo Habkost
2016-11-07 17:41 ` Daniel P. Berrange
2016-11-07 18:03 ` Eduardo Habkost
2016-11-07 18:08 ` Daniel P. Berrange
2016-11-07 18:28 ` Eduardo Habkost
2016-11-08 7:37 ` Markus Armbruster
2016-11-08 10:09 ` Daniel P. Berrange
2016-11-08 14:35 ` Markus Armbruster
2016-11-08 16:16 ` Eduardo Habkost
2016-11-08 10:11 ` Halil Pasic
2016-10-29 1:48 ` [Qemu-arm] [PATCH v4 8/8] qdev: Warning about using qdev_property_add_static() in new code Eduardo Habkost
2016-10-29 1:48 ` [Qemu-devel] " Eduardo Habkost
2016-10-31 14:05 ` [Qemu-arm] " Igor Mammedov
2016-10-31 14:05 ` [Qemu-devel] " Igor Mammedov
2016-11-04 15:52 ` [Qemu-devel] [PATCH v4 0/8] qdev class properties + abstract class support on device-list-properties Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ins35kxr.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=afaerber@suse.de \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.