qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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);

  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).