From: Anthony Liguori <anthony@codemonkey.ws>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 04/16] qom: add QObject-based property get/set wrappers
Date: Thu, 02 Feb 2012 13:06:24 -0600 [thread overview]
Message-ID: <4F2ADEB0.6090308@codemonkey.ws> (raw)
In-Reply-To: <1328201142-26145-5-git-send-email-pbonzini@redhat.com>
On 02/02/2012 10:45 AM, Paolo Bonzini wrote:
> Move the creation of QmpInputVisitor and QmpOutputVisitor from
> qmp.c to qom/object.c, since it's the only practical way to access
> object properties.
>
> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>
> ---
> include/qemu/object.h | 24 ++++++++++++++++++++++++
> qmp.c | 17 ++---------------
> qom/object.c | 29 +++++++++++++++++++++++++++++
> 3 files changed, 55 insertions(+), 15 deletions(-)
I don't want object.h to have a dependency on QObject. We need to phase out
QObject.
Couple things:
1) We shouldn't use generic interfaces to read/write properties from objects.
We should use type-safe accessors provided by the types themselves.
2) If we want to get fancy, we can add property_set_int, etc. and then implement
(1) via header files that just call these functions.
Regards,
Anthony Liguori
>
> diff --git a/include/qemu/object.h b/include/qemu/object.h
> index 947cf29..71090f2 100644
> --- a/include/qemu/object.h
> +++ b/include/qemu/object.h
> @@ -542,6 +542,18 @@ void object_property_get(Object *obj, struct Visitor *v, const char *name,
> struct Error **errp);
>
> /**
> + * object_property_get_qobject:
> + * @obj: the object
> + * @name: the name of the property
> + * @errp: returns an error if this function fails
> + *
> + * Returns: the value of the property, converted to QObject, or NULL if
> + * an error occurs.
> + */
> +struct QObject *object_property_get_qobject(Object *obj, const char *name,
> + struct Error **errp);
> +
> +/**
> * object_property_set:
> * @obj: the object
> * @v: the visitor that will be used to write the property value. This should
> @@ -556,6 +568,18 @@ void object_property_set(Object *obj, struct Visitor *v, const char *name,
> struct Error **errp);
>
> /**
> + * object_property_set_qobject:
> + * @obj: the object
> + * @ret: The value that will be written to the property.
> + * @name: the name of the property
> + * @errp: returns an error if this function fails
> + *
> + * Writes a property to a object.
> + */
> +void object_property_set_qobject(Object *obj, struct QObject *qobj,
> + const char *name, struct Error **errp);
> +
> +/**
> * @object_property_get_type:
> * @obj: the object
> * @name: the name of the property
> diff --git a/qmp.c b/qmp.c
> index 45052cc..c7a81cc 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -21,8 +21,6 @@
> #include "kvm.h"
> #include "arch_init.h"
> #include "hw/qdev.h"
> -#include "qapi/qmp-input-visitor.h"
> -#include "qapi/qmp-output-visitor.h"
> #include "blockdev.h"
>
> NameInfo *qmp_query_name(Error **errp)
> @@ -198,7 +196,6 @@ int qmp_qom_set(Monitor *mon, const QDict *qdict, QObject **ret)
> const char *property = qdict_get_str(qdict, "property");
> QObject *value = qdict_get(qdict, "value");
> Error *local_err = NULL;
> - QmpInputVisitor *mi;
> Object *obj;
>
> obj = object_resolve_path(path, NULL);
> @@ -207,10 +204,7 @@ int qmp_qom_set(Monitor *mon, const QDict *qdict, QObject **ret)
> goto out;
> }
>
> - mi = qmp_input_visitor_new(value);
> - object_property_set(obj, qmp_input_get_visitor(mi), property,&local_err);
> -
> - qmp_input_visitor_cleanup(mi);
> + object_property_set_qobject(obj, value, property,&local_err);
>
> out:
> if (local_err) {
> @@ -227,7 +221,6 @@ int qmp_qom_get(Monitor *mon, const QDict *qdict, QObject **ret)
> const char *path = qdict_get_str(qdict, "path");
> const char *property = qdict_get_str(qdict, "property");
> Error *local_err = NULL;
> - QmpOutputVisitor *mo;
> Object *obj;
>
> obj = object_resolve_path(path, NULL);
> @@ -236,13 +229,7 @@ int qmp_qom_get(Monitor *mon, const QDict *qdict, QObject **ret)
> goto out;
> }
>
> - mo = qmp_output_visitor_new();
> - object_property_get(obj, qmp_output_get_visitor(mo), property,&local_err);
> - if (!local_err) {
> - *ret = qmp_output_get_qobject(mo);
> - }
> -
> - qmp_output_visitor_cleanup(mo);
> + *ret = object_property_get_qobject(obj, property,&local_err);
>
> out:
> if (local_err) {
> diff --git a/qom/object.c b/qom/object.c
> index 299e146..13c8bec 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -13,6 +13,8 @@
> #include "qemu/object.h"
> #include "qemu-common.h"
> #include "qapi/qapi-visit-core.h"
> +#include "qapi/qmp-input-visitor.h"
> +#include "qapi/qmp-output-visitor.h"
>
> #define MAX_INTERFACES 32
>
> @@ -646,6 +648,33 @@ void object_property_set(Object *obj, Visitor *v, const char *name,
> }
> }
>
> +void object_property_set_qobject(Object *obj, QObject *value,
> + const char *name, Error **errp)
> +{
> + QmpInputVisitor *mi;
> + mi = qmp_input_visitor_new(value);
> + object_property_set(obj, qmp_input_get_visitor(mi), name, errp);
> +
> + qmp_input_visitor_cleanup(mi);
> +}
> +
> +QObject *object_property_get_qobject(Object *obj, const char *name,
> + Error **errp)
> +{
> + QObject *ret = NULL;
> + Error *local_err = NULL;
> + QmpOutputVisitor *mo;
> +
> + mo = qmp_output_visitor_new();
> + object_property_get(obj, qmp_output_get_visitor(mo), name,&local_err);
> + if (!local_err) {
> + ret = qmp_output_get_qobject(mo);
> + }
> + error_propagate(errp, local_err);
> + qmp_output_visitor_cleanup(mo);
> + return ret;
> +}
> +
> const char *object_property_get_type(Object *obj, const char *name, Error **errp)
> {
> ObjectProperty *prop = object_property_find(obj, name);
next prev parent reply other threads:[~2012-02-02 19:06 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-02 16:45 [Qemu-devel] [PATCH 00/16] access qdev properties via QOM Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 01/16] qdev: fix hot-unplug Paolo Bonzini
2012-02-02 17:03 ` Anthony Liguori
2012-02-02 17:29 ` Paolo Bonzini
2012-02-02 19:01 ` Anthony Liguori
2012-02-02 19:07 ` Alexander Graf
2012-02-02 20:03 ` Anthony Liguori
2012-02-02 20:31 ` Alexander Graf
2012-02-03 16:37 ` Anthony Liguori
2012-02-03 16:57 ` Alexander Graf
2012-02-03 17:12 ` Anthony Liguori
2012-02-03 14:27 ` Anthony Liguori
2012-02-04 0:27 ` Paolo Bonzini
2012-02-04 3:03 ` Anthony Liguori
2012-02-04 6:51 ` Paolo Bonzini
2012-02-04 17:13 ` Anthony Liguori
2012-02-02 16:45 ` [Qemu-devel] [PATCH 02/16] qom: store object with correct type in interface links Paolo Bonzini
2012-02-02 17:05 ` Anthony Liguori
2012-02-03 12:10 ` Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 03/16] qom: do not include qdev header file Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 04/16] qom: add QObject-based property get/set wrappers Paolo Bonzini
2012-02-02 19:06 ` Anthony Liguori [this message]
2012-02-02 19:21 ` Andreas Färber
2012-02-02 20:58 ` Anthony Liguori
2012-02-02 19:24 ` Paolo Bonzini
2012-02-02 19:29 ` Paolo Bonzini
2012-02-02 20:01 ` Anthony Liguori
2012-02-02 19:36 ` Anthony Liguori
2012-02-02 20:08 ` Paolo Bonzini
2012-02-02 20:59 ` Anthony Liguori
2012-02-02 16:45 ` [Qemu-devel] [PATCH 05/16] qom: add property get/set wrappers for C types Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 06/16] qdev: remove direct calls to print/parse Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 07/16] qdev: allow reusing get/set for legacy property Paolo Bonzini
2012-02-02 22:38 ` Andreas Färber
2012-02-03 8:11 ` Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 08/16] qdev: remove parse method for string properties Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 09/16] qdev: remove parse/print methods for mac properties Paolo Bonzini
2012-02-02 20:05 ` Anthony Liguori
2012-02-02 16:45 ` [Qemu-devel] [PATCH 10/16] qdev: make the non-legacy pci address property accept an integer Paolo Bonzini
2012-02-02 20:07 ` Anthony Liguori
2012-02-02 20:19 ` Paolo Bonzini
2012-02-03 14:14 ` Anthony Liguori
2012-02-04 0:21 ` Paolo Bonzini
2012-02-04 0:43 ` Paolo Bonzini
2012-02-04 3:00 ` Anthony Liguori
2012-02-04 6:42 ` Paolo Bonzini
2012-02-04 7:13 ` Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 11/16] qdev: remove parse/print methods for pointer properties Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 12/16] qdev: let QOM free properties Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 13/16] qdev: fix off-by-one Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 14/16] qdev: access properties via QOM Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 15/16] qdev: inline qdev_prop_set into qdev_prop_set_ptr Paolo Bonzini
2012-02-02 16:45 ` [Qemu-devel] [PATCH 16/16] qdev: initialize properties via QOM Paolo Bonzini
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=4F2ADEB0.6090308@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=pbonzini@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).