Skip to content

Commit

Permalink
qmp: Add qom-list-properties to list QOM object properties
Browse files Browse the repository at this point in the history
There is already 'device-list-properties' which does most of the job,
however it does not handle everything returned by qom-list-types such
as machines as they inherit directly from TYPE_OBJECT and not TYPE_DEVICE.
It does not handle abstract classes either.

This adds a new qom-list-properties command which prints properties
of a specific class and its instance. It is pretty much a simplified copy
of the device-list-properties handler.

Since it creates an object instance, device properties should appear
in the output as they are copied to QOM properties at the instance_init
hook.

This adds a object_class_property_iter_init() helper to allow class
properties enumeration uses it in the new QMP command to allow properties
listing for abstract classes.

Signed-off-by: Alexey Kardashevskiy <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
aik authored and bonzini committed Mar 6, 2018
1 parent 35f6376 commit 961c47b
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 0 deletions.
16 changes: 16 additions & 0 deletions include/qom/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -1016,6 +1016,22 @@ typedef struct ObjectPropertyIterator {
void object_property_iter_init(ObjectPropertyIterator *iter,
Object *obj);

/**
* object_class_property_iter_init:
* @klass: the class
*
* Initializes an iterator for traversing all properties
* registered against an object class and all parent classes.
*
* It is forbidden to modify the property list while iterating,
* whether removing or adding properties.
*
* This can be used on abstract classes as it does not create a temporary
* instance.
*/
void object_class_property_iter_init(ObjectPropertyIterator *iter,
ObjectClass *klass);

/**
* object_property_iter_next:
* @iter: the iterator instance
Expand Down
15 changes: 15 additions & 0 deletions qapi/misc.json
Original file line number Diff line number Diff line change
Expand Up @@ -1460,6 +1460,21 @@
'data': { 'typename': 'str'},
'returns': [ 'ObjectPropertyInfo' ] }

##
# @qom-list-properties:
#
# List properties associated with a QOM object.
#
# @typename: the type name of an object
#
# Returns: a list of ObjectPropertyInfo describing object properties
#
# Since: 2.12
##
{ 'command': 'qom-list-properties',
'data': { 'typename': 'str'},
'returns': [ 'ObjectPropertyInfo' ] }

##
# @xen-set-global-dirty-log:
#
Expand Down
49 changes: 49 additions & 0 deletions qmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,55 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
return prop_list;
}

ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
Error **errp)
{
ObjectClass *klass;
Object *obj = NULL;
ObjectProperty *prop;
ObjectPropertyIterator iter;
ObjectPropertyInfoList *prop_list = NULL;

klass = object_class_by_name(typename);
if (klass == NULL) {
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
"Class '%s' not found", typename);
return NULL;
}

klass = object_class_dynamic_cast(klass, TYPE_OBJECT);
if (klass == NULL) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename", TYPE_OBJECT);
return NULL;
}

if (object_class_is_abstract(klass)) {
object_class_property_iter_init(&iter, klass);
} else {
obj = object_new(typename);
object_property_iter_init(&iter, obj);
}
while ((prop = object_property_iter_next(&iter))) {
ObjectPropertyInfo *info;
ObjectPropertyInfoList *entry;

info = g_malloc0(sizeof(*info));
info->name = g_strdup(prop->name);
info->type = g_strdup(prop->type);
info->has_description = !!prop->description;
info->description = g_strdup(prop->description);

entry = g_malloc0(sizeof(*entry));
entry->value = info;
entry->next = prop_list;
prop_list = entry;
}

object_unref(obj);

return prop_list;
}

CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
{
return arch_query_cpu_definitions(errp);
Expand Down
7 changes: 7 additions & 0 deletions qom/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,13 @@ ObjectProperty *object_property_iter_next(ObjectPropertyIterator *iter)
return val;
}

void object_class_property_iter_init(ObjectPropertyIterator *iter,
ObjectClass *klass)
{
g_hash_table_iter_init(&iter->iter, klass->properties);
iter->nextclass = klass;
}

ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
Error **errp)
{
Expand Down

0 comments on commit 961c47b

Please sign in to comment.