All of lore.kernel.org
 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 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.