From: "Daniel P. Berrange" <berrange@redhat.com>
To: Valentin Rakush <valentin.rakush@gmail.com>
Cc: armbru@redhat.com, qemu-devel@nongnu.org, lcapitulino@redhat.com,
asmetanin@virtuozzo.com, den@openvz.org, afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH] qom, qmp, hmp, qapi: create qom-type-list for class properties
Date: Wed, 20 Jan 2016 11:41:55 +0000 [thread overview]
Message-ID: <20160120114155.GB13628@redhat.com> (raw)
In-Reply-To: <1453282958-385-1-git-send-email-valentin.rakush@gmail.com>
On Wed, Jan 20, 2016 at 12:42:38PM +0300, Valentin Rakush wrote:
> This patch adds support for qom-type-list command that supposed to list object class properties. Will use this functionality further to implement x86_64 cpu properties.
>
> Additionally object_class_property_iterator_init function is implemented for consistency.
Please line break your commit messages at approx 72 characters
> Signed-off-by: Valentin Rakush <valentin.rakush@gmail.com>
> Cc: Luiz Capitulino <lcapitulino@redhat.com>
> Cc: Eric Blake <eblake@redhat.com>
> Cc: Markus Armbruster <armbru@redhat.com>
> Cc: Andreas Färber <afaerber@suse.de>
> Cc: Daniel P. Berrange <berrange@redhat.com>
> ---
> hmp.c | 26 ++++++++++++++++++++++++++
> hmp.h | 1 +
> include/qom/object.h | 31 +++++++++++++++++++++++++++++++
> qapi-schema.json | 19 +++++++++++++++++++
> qmp-commands.hx | 6 ++++++
> qmp.c | 29 +++++++++++++++++++++++++++++
> qom/object.c | 8 ++++++++
> 7 files changed, 120 insertions(+)
>
> diff --git a/hmp.c b/hmp.c
> index 54f2620..64aa991 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -2052,6 +2052,32 @@ void hmp_qom_list(Monitor *mon, const QDict *qdict)
> hmp_handle_error(mon, &err);
> }
>
> +void hmp_qom_type_list(Monitor *mon, const QDict *qdict)
> +{
> + const char *path = qdict_get_try_str(qdict, "path");
> + ObjectPropertyInfoList *list;
> + Error *err = NULL;
> +
> + if (path == NULL) {
> + monitor_printf(mon, "/\n");
> + return;
> + }
> +
> + list = qmp_qom_type_list(path, &err);
> + if (err == NULL) {
> + ObjectPropertyInfoList *start = list;
> + while (list != NULL) {
> + ObjectPropertyInfo *value = list->value;
> +
> + monitor_printf(mon, "%s (%s)\n",
> + value->name, value->type);
> + list = list->next;
> + }
> + qapi_free_ObjectPropertyInfoList(start);
> + }
> + hmp_handle_error(mon, &err);
> +}
> +
> void hmp_qom_set(Monitor *mon, const QDict *qdict)
> {
> const char *path = qdict_get_str(qdict, "path");
> diff --git a/hmp.h b/hmp.h
> index a8c5b5a..d81cd4c 100644
> --- a/hmp.h
> +++ b/hmp.h
> @@ -103,6 +103,7 @@ void hmp_object_del(Monitor *mon, const QDict *qdict);
> void hmp_info_memdev(Monitor *mon, const QDict *qdict);
> void hmp_info_memory_devices(Monitor *mon, const QDict *qdict);
> void hmp_qom_list(Monitor *mon, const QDict *qdict);
> +void hmp_qom_type_list(Monitor *mon, const QDict *qdict);
> void hmp_qom_set(Monitor *mon, const QDict *qdict);
> void object_add_completion(ReadLineState *rs, int nb_args, const char *str);
> void object_del_completion(ReadLineState *rs, int nb_args, const char *str);
> diff --git a/include/qom/object.h b/include/qom/object.h
> index d0dafe9..f8ca725 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1013,6 +1013,37 @@ void object_property_iter_init(ObjectPropertyIterator *iter,
> */
> ObjectProperty *object_property_iter_next(ObjectPropertyIterator *iter);
>
> +/**
> + * object_class_property_iter_init:
> + * @klass: the klass to iter properties for
> + *
> + * Initializes an iterator for traversing all properties
> + * registered against a klass type and all parent classes.
> + *
> + * It is forbidden to modify the property list while iterating,
> + * whether removing or adding properties.
> + *
> + * NB For getting next property in the list the object related
> + * function object_property_iter_next is still used.
> + *
> + * Typical usage pattern would be
> + *
> + * <example>
> + * <title>Using object class property iterators</title>
> + * <programlisting>
> + * ObjectProperty *prop;
> + * ObjectPropertyIterator iter;
> + *
> + * object_class property_iter_init(&iter, obj);
> + * while ((prop = object_property_iter_next(&iter))) {
> + * ... do something with prop ...
> + * }
> + * </programlisting>
> + * </example>
> + */
> +void object_class_property_iter_init(ObjectPropertyIterator *iter,
> + ObjectClass *klass);
> +
> void object_unparent(Object *obj);
>
> /**
> diff --git a/qapi-schema.json b/qapi-schema.json
> index b3038b2..c50d24c 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -4081,3 +4081,22 @@
> ##
> { 'enum': 'ReplayMode',
> 'data': [ 'none', 'record', 'play' ] }
> +
> +##
> +# @qom-type-list:
I realize you're following the pattern of 'qom-list' but that
in itself is a misleading name really.
So i'd suggest we call this 'qom-type-prop-list' to more
accurately describe what it is doing.
> +#
> +# This command will list any properties of a object class
> +# given a path in the object class model.
> +#
> +# @path: the path within the object class model. See @qom-list-types
> +# to check available object class names.
> +#
> +# Returns: a list of @ObjectPropertyInfo that describe the properties of the
> +# object class.
> +#
> +# Since: 2.6
> +##
> +{ 'command': 'qom-type-list',
> + 'data': { 'path': 'str' },
This should be called 'typename' really, as this is not
an object path.
> + 'returns': [ 'ObjectPropertyInfo' ] }
> +
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index db072a6..4e5dd48 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -3789,6 +3789,12 @@ EQMP
> },
>
> {
> + .name = "qom-type-list",
> + .args_type = "path:s",
> + .mhandler.cmd_new = qmp_marshal_qom_type_list,
> + },
> +
> + {
> .name = "qom-set",
> .args_type = "path:s,property:s,value:q",
> .mhandler.cmd_new = qmp_marshal_qom_set,
> diff --git a/qmp.c b/qmp.c
> index 3ff6db7..86dd1f2 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -448,6 +448,35 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
> return ret;
> }
>
> +ObjectPropertyInfoList *qmp_qom_type_list(const char *path, Error **errp)
With my earlier change this will become s/path/typename/
> +{
> + ObjectClass *klass;
> + ObjectPropertyInfoList *props = NULL;
> + ObjectProperty* prop;
> + ObjectPropertyIterator iter;
> +
> + klass = object_class_by_name(path);
> + if (klass == NULL) {
> + error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
> + "Object class '%s' not found", path);
> + return NULL;
> + }
> +
> + object_class_property_iter_init(&iter, klass);
> + while ((prop = object_property_iter_next(&iter))) {
> + ObjectPropertyInfoList *entry = g_malloc0(sizeof(*entry));
This could be g_new0(ObjectPropertyInfoList, 1) instead
of using g_malloc + sizeof directly.
> +
> + entry->value = g_malloc0(sizeof(ObjectPropertyInfo));
> + entry->next = props;
> + props = entry;
> +
> + entry->value->name = g_strdup(prop->name);
> + entry->value->type = g_strdup(prop->type);
> + }
> +
> + return props;
> +}
> +
> /* Return a DevicePropertyInfo for a qdev property.
> *
> * If a qdev property with the given name does not exist, use the given default
> diff --git a/qom/object.c b/qom/object.c
> index 5ff97ab..a158076 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -994,6 +994,14 @@ ObjectProperty *object_property_find(Object *obj, const char *name,
> return NULL;
> }
>
> +void object_class_property_iter_init(ObjectPropertyIterator *iter,
> + ObjectClass *klass)
Vertically align the 'ObjectClass' with 'ObjectPropertyIterator'
> +{
> + g_hash_table_iter_init(&iter->iter, klass->properties);
> + iter->nextclass = object_class_get_parent(klass);
> +
Can kil this extra blank line
> +}
> +
> void object_property_iter_init(ObjectPropertyIterator *iter,
> Object *obj)
> {
Overall the code looks good - just bikeshedding over some naming and
a few other minor points.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
next prev parent reply other threads:[~2016-01-20 11:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-20 9:42 [Qemu-devel] [PATCH] qom, qmp, hmp, qapi: create qom-type-list for class properties Valentin Rakush
2016-01-20 11:41 ` Daniel P. Berrange [this message]
2016-01-20 16:38 ` Eric Blake
2016-01-20 18:15 ` Daniel P. Berrange
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=20160120114155.GB13628@redhat.com \
--to=berrange@redhat.com \
--cc=afaerber@suse.de \
--cc=armbru@redhat.com \
--cc=asmetanin@virtuozzo.com \
--cc=den@openvz.org \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=valentin.rakush@gmail.com \
/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.