From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53034) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aO5tw-0004NL-8j for qemu-devel@nongnu.org; Tue, 26 Jan 2016 10:51:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aO5tu-0008FS-MJ for qemu-devel@nongnu.org; Tue, 26 Jan 2016 10:51:28 -0500 Received: from mx1.redhat.com ([209.132.183.28]:33115) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aO5tu-0008FA-E8 for qemu-devel@nongnu.org; Tue, 26 Jan 2016 10:51:26 -0500 Date: Tue, 26 Jan 2016 15:51:21 +0000 From: "Daniel P. Berrange" Message-ID: <20160126155121.GI15172@redhat.com> References: <1453710287-12706-1-git-send-email-valentin.rakush@gmail.com> <20160126153538.GN3869@thinpad.lan.raisama.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20160126153538.GN3869@thinpad.lan.raisama.net> Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v5] qom, qmp, hmp, qapi: create qom-type-prop-list for class properties Reply-To: "Daniel P. Berrange" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Eduardo Habkost Cc: qemu-devel@nongnu.org, armbru@redhat.com, lcapitulino@redhat.com, afaerber@suse.de, asmetanin@virtuozzo.com, den@openvz.org, Valentin Rakush On Tue, Jan 26, 2016 at 01:35:38PM -0200, Eduardo Habkost wrote: > On Mon, Jan 25, 2016 at 11:24:47AM +0300, Valentin Rakush wrote: > > This patch adds support for qom-type-prop-list command to list object > > class properties. A later patch will use this functionality to > > implement x86_64-cpu properties. > >=20 > > Signed-off-by: Valentin Rakush > > Cc: Luiz Capitulino > > Cc: Eric Blake > > Cc: Markus Armbruster > > Cc: Andreas F=C3=A4rber > > Cc: Daniel P. Berrange > > Cc: Eduardo Habkost > > --- > [...] > > diff --git a/qmp.c b/qmp.c > > index 53affe2..baf25c0 100644 > > --- a/qmp.c > > +++ b/qmp.c > > @@ -460,6 +460,37 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_= implements, > > return ret; > > } > > =20 > > +ObjectPropertyInfoList *qmp_qom_type_prop_list(const char *typename,= Error **errp) > > +{ > > + ObjectClass *klass; > > + ObjectPropertyInfoList *props =3D NULL; > > + ObjectProperty *prop; > > + ObjectPropertyIterator iter; > > + > > + klass =3D object_class_by_name(typename); > > + if (!klass) { > > + error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND, > > + "Object class '%s' not found", typename); > > + return NULL; > > + } > > + > > + object_class_property_iter_init(&iter, klass); > > + while ((prop =3D object_property_iter_next(&iter))) { > > + ObjectPropertyInfoList *entry =3D g_new0(ObjectPropertyInfoL= ist, 1); > > + > > + if (entry) { > > + entry->value =3D g_new0(ObjectPropertyInfo, 1); > > + entry->next =3D props; > > + props =3D entry; > > + > > + entry->value->name =3D g_strdup(prop->name); > > + entry->value->type =3D g_strdup(prop->type); > > + } > > + } > > + > > + return props; > > +} > > + >=20 > We already have "-device ,help", and it uses a completely > different mechanism for listing properties. There's no reason for > having two arbitrarily different APIs for listing properties > returning different results. >=20 > If qmp_device_list_properties() is not enough for you, please > clarify why, so we can consider improving it. qmp_device_list_properties() has to actually instantiate an instance of objects it is reporting properties against, since it is reporting properties registered against object instances. In fact it only reports properties against things which are TYPE_DEVICE - it'll refuse to report other object types. Having to instantiate objects is inherantly limiting to the command because there are some objects that cannot be instantiated for this purpose. eg abstract objects and objects marked "cannot_destroy_with_object_finalize_yet". Finally there is also a performance and memory overhead in having to instantiate objects which is best avoided. This new API is reporting properties that are statically registered against the *class* rather than than object instance. It is guaranteed that you can always report these properties for any class without any restrictions, nor any chance of side effects during instantiation. Regards, Daniel --=20 |: http://berrange.com -o- http://www.flickr.com/photos/dberrange= / :| |: http://libvirt.org -o- http://virt-manager.or= g :| |: http://autobuild.org -o- http://search.cpan.org/~danberr= / :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vn= c :|