diff options
author | Igor Mammedov <imammedo@redhat.com> | 2014-01-16 17:34:38 +0100 |
---|---|---|
committer | Luiz Capitulino <lcapitulino@redhat.com> | 2014-01-28 12:47:02 -0500 |
commit | 269e09f3fc922b800d118d9c8a721be46b5462a3 (patch) | |
tree | 45a18489d3fa4c2bb54e96f7f26ca9f7f6a0af81 /qmp.c | |
parent | 90e9cf28e57a3e1d6caa0a28b0a332ff982ccb0b (diff) | |
download | qemu-269e09f3fc922b800d118d9c8a721be46b5462a3.zip qemu-269e09f3fc922b800d118d9c8a721be46b5462a3.tar.gz qemu-269e09f3fc922b800d118d9c8a721be46b5462a3.tar.bz2 |
add optional 2nd stage initialization to -object/object-add commands
Introduces USER_CREATABLE interface that must be implemented by
objects which are designed to created with -object CLI option or
object-add QMP command.
Interface provides an ability to do an optional second stage
initialization of the object created with -object/object-add
commands. By providing complete() callback, which is called
after the object properties were set.
It allows to:
* prevents misusing of -object/object-add by filtering out
objects that are not designed for it.
* generalize second stage backend initialization instead of
adding custom APIs to perform it
* early error detection of backend initialization at -object/
object-add time rather than through a proxy DEVICE object
that tries to use backend.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Diffstat (limited to 'qmp.c')
-rw-r--r-- | qmp.c | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -27,6 +27,7 @@ #include "qapi/qmp/qobject.h" #include "qapi/qmp-input-visitor.h" #include "hw/boards.h" +#include "qom/object_interfaces.h" NameInfo *qmp_query_name(Error **errp) { @@ -554,6 +555,17 @@ void object_add(const char *type, const char *id, const QDict *qdict, } } + if (!object_dynamic_cast(obj, TYPE_USER_CREATABLE)) { + error_setg(&local_err, "object '%s' isn't supported by object-add", + id); + goto out; + } + + user_creatable_complete(obj, &local_err); + if (local_err) { + goto out; + } + object_property_add_child(container_get(object_get_root(), "/objects"), id, obj, &local_err); out: |