[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 03/32] qom: Make all interface types abstract
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 03/32] qom: Make all interface types abstract |
Date: |
Mon, 16 Jan 2017 17:58:47 +0100 |
From: Eduardo Habkost <address@hidden>
"qom-list-types abstract=false" currently returns all interface
types, as if they were not abstract. Fix this by making sure all
interface types are abstract.
All interface types have instance_size == 0, so we can use
it to set abstract=true on type_initialize().
Signed-off-by: Eduardo Habkost <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
qom/object.c | 6 +++++
tests/device-introspect-test.c | 60 +++++++++++++++++++++++++++++++++++++++---
2 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/qom/object.c b/qom/object.c
index 7a05e35..760fafb 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -272,6 +272,12 @@ static void type_initialize(TypeImpl *ti)
ti->class_size = type_class_get_size(ti);
ti->instance_size = type_object_get_size(ti);
+ /* Any type with zero instance_size is implicitly abstract.
+ * This means interface types are all abstract.
+ */
+ if (ti->instance_size == 0) {
+ ti->abstract = true;
+ }
ti->class = g_malloc0(ti->class_size);
diff --git a/tests/device-introspect-test.c b/tests/device-introspect-test.c
index 37debc1..c5637cc 100644
--- a/tests/device-introspect-test.c
+++ b/tests/device-introspect-test.c
@@ -20,18 +20,24 @@
#include "qemu/osdep.h"
#include "qemu-common.h"
#include "qapi/qmp/qstring.h"
+#include "qapi/qmp/qbool.h"
+#include "qapi/qmp/qdict.h"
#include "libqtest.h"
const char common_args[] = "-nodefaults -machine none";
-static QList *device_type_list(bool abstract)
+static QList *qom_list_types(const char *implements, bool abstract)
{
QDict *resp;
QList *ret;
+ QDict *args = qdict_new();
+ qdict_put(args, "abstract", qbool_from_bool(abstract));
+ if (implements) {
+ qdict_put(args, "implements", qstring_from_str(implements));
+ }
resp = qmp("{'execute': 'qom-list-types',"
- " 'arguments': {'implements': 'device', 'abstract': %i}}",
- abstract);
+ " 'arguments': %p }", args);
g_assert(qdict_haskey(resp, "return"));
ret = qdict_get_qlist(resp, "return");
QINCREF(ret);
@@ -39,6 +45,11 @@ static QList *device_type_list(bool abstract)
return ret;
}
+static QList *device_type_list(bool abstract)
+{
+ return qom_list_types("device", abstract);
+}
+
static void test_one_device(const char *type)
{
QDict *resp;
@@ -110,6 +121,48 @@ static void test_device_intro_concrete(void)
qtest_end();
}
+static void test_abstract_interfaces(void)
+{
+ QList *all_types;
+ QList *obj_types;
+ QListEntry *ae;
+
+ qtest_start(common_args);
+ /* qom-list-types implements=interface would return any type
+ * that implements _any_ interface (not just interface types),
+ * so use a trick to find the interface type names:
+ * - list all object types
+ * - list all types, and look for items that are not
+ * on the first list
+ */
+ all_types = qom_list_types(NULL, false);
+ obj_types = qom_list_types("object", false);
+
+ QLIST_FOREACH_ENTRY(all_types, ae) {
+ QDict *at = qobject_to_qdict(qlist_entry_obj(ae));
+ const char *aname = qdict_get_str(at, "name");
+ QListEntry *oe;
+ const char *found = NULL;
+
+ QLIST_FOREACH_ENTRY(obj_types, oe) {
+ QDict *ot = qobject_to_qdict(qlist_entry_obj(oe));
+ const char *oname = qdict_get_str(ot, "name");
+ if (!strcmp(aname, oname)) {
+ found = oname;
+ break;
+ }
+ }
+
+ /* Using g_assert_cmpstr() will give more useful failure
+ * messages than g_assert(found) */
+ g_assert_cmpstr(aname, ==, found);
+ }
+
+ QDECREF(all_types);
+ QDECREF(obj_types);
+ qtest_end();
+}
+
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
@@ -118,6 +171,7 @@ int main(int argc, char **argv)
qtest_add_func("device/introspect/none", test_device_intro_none);
qtest_add_func("device/introspect/abstract", test_device_intro_abstract);
qtest_add_func("device/introspect/concrete", test_device_intro_concrete);
+ qtest_add_func("device/introspect/abstract-interfaces",
test_abstract_interfaces);
return g_test_run();
}
--
2.9.3
- [Qemu-devel] [PULL v2 00/32] Misc patches for 2017-01-11, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 01/32] bugfix: vm halt when in reset looping, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 02/32] megasas: fix guest-triggered memory leak, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 03/32] qom: Make all interface types abstract,
Paolo Bonzini <=
- [Qemu-devel] [PULL 05/32] stubs: merge all monitor stubs in one file, remove monitor_cur_is_qmp stub, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 04/32] smbios: filter based on CONFIG_SMBIOS rather than TARGET, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 06/32] stubs: move smbios stubs to hw/smbios, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 07/32] stubs: move acpi stubs to hw/acpi, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 08/32] stubs: remove unused stub for serial_hd, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 11/32] stubs: group all monitor_fdset_* functions in a single file, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 12/32] stubs: move vhost stubs to stubs/vhost.o, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 10/32] stubs: group stubs for user-mode emulation, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 09/32] hw: move reset handlers from vl.c to hw/core, Paolo Bonzini, 2017/01/16
- [Qemu-devel] [PULL 13/32] event_notifier: cleanups around event_notifier_set_handler, Paolo Bonzini, 2017/01/16