Re: [PATCH v2 09/53] qom/qmp: populate qapi-type in QMP handlers

Markus Armbruster <[email protected]>
Newsgroups gmane.comp.emulators.qemu
Message-ID <[email protected]>
Marc-André Lureau <[email protected]> writes:

> Wire up the new qapi-type field in all four QMP handlers that return
> ObjectPropertyInfo or ObjectPropertyValue: qom-list, qom-list-get,
> device-list-properties, and qom-list-properties.
>
> When an ObjectProperty has a qapi_type set, the masked QAPI type name
> is copied into the response, allowing clients to cross-reference with
> query-qmp-schema.

Again, I'd mention that no property has it set just yet.

>
> Signed-off-by: Marc-André Lureau <[email protected]>
> ---
>  qom/qom-qmp-cmds.c | 32 +++++++++++++++++++-------------
>  1 file changed, 19 insertions(+), 13 deletions(-)
>
> diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
> index 48b38d2b7f7..30af2cef53e 100644
> --- a/qom/qom-qmp-cmds.c
> +++ b/qom/qom-qmp-cmds.c
> @@ -25,9 +25,22 @@
>  #include "qapi/qobject-input-visitor.h"
>  #include "qapi/qobject-output-visitor.h"
>  #include "qemu/cutils.h"
> +#include "qapi/qapi-type-info.h"
>  #include "qom/object_interfaces.h"
>  #include "qom/qom-qobject.h"
>  
> +static ObjectPropertyInfo *qom_property_info(ObjectProperty *prop)
> +{
> +    ObjectPropertyInfo *info = g_new0(ObjectPropertyInfo, 1);
> +
> +    info->name = g_strdup(prop->name);
> +    info->type = g_strdup(prop->type);
> +    if (prop->qapi_type) {
> +        info->qapi_type = g_strdup(prop->qapi_type->schema_name);
> +    }
> +    return info;
> +}
> +
>  static Object *qom_resolve_path(const char *path, Error **errp)
>  {
>      bool ambiguous = false;
> @@ -58,12 +71,7 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
>  
>      object_property_iter_init(&iter, obj);
>      while ((prop = object_property_iter_next(&iter))) {
> -        ObjectPropertyInfo *value = g_new0(ObjectPropertyInfo, 1);
> -
> -        QAPI_LIST_PREPEND(props, value);
> -
> -        value->name = g_strdup(prop->name);
> -        value->type = g_strdup(prop->type);
> +        QAPI_LIST_PREPEND(props, qom_property_info(prop));

Non-idempotent macro arguments scare me.  This one works, because
QAPI_LIST_PREPEND() evaluates its second argument exactly once.  It even
spells it out in a contract.  Okay.

>      }
>  
>      return props;
> @@ -78,6 +86,9 @@ static void qom_list_add_property_value(Object *obj, ObjectProperty *prop,
>  
>      item->name = g_strdup(prop->name);
>      item->type = g_strdup(prop->type);
> +    if (prop->qapi_type) {
> +        item->qapi_type = g_strdup(prop->qapi_type->schema_name);
> +    }
>      item->value = object_property_get_qobject(obj, prop->name, NULL);
>  }
>  
> @@ -225,9 +236,7 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
>              continue;
>          }
>  
> -        info = g_new0(ObjectPropertyInfo, 1);
> -        info->name = g_strdup(prop->name);
> -        info->type = g_strdup(prop->type);
> +        info = qom_property_info(prop);
>          info->description = g_strdup(prop->description);
>          info->default_value = qobject_ref(prop->defval);
>  
> @@ -268,11 +277,8 @@ ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
>          object_property_iter_init(&iter, obj);
>      }
>      while ((prop = object_property_iter_next(&iter))) {
> -        ObjectPropertyInfo *info;
> +        ObjectPropertyInfo *info = qom_property_info(prop);
>  
> -        info = g_malloc0(sizeof(*info));
> -        info->name = g_strdup(prop->name);
> -        info->type = g_strdup(prop->type);
>          info->description = g_strdup(prop->description);
>          info->default_value = qobject_ref(prop->defval);

Reviewed-by: Markus Armbruster <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.