aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/qemu/object.h1
-rw-r--r--qom/object.c18
2 files changed, 17 insertions, 2 deletions
diff --git a/include/qemu/object.h b/include/qemu/object.h
index ba37850a08..adbcfb1c1a 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -431,6 +431,7 @@ const char *object_class_get_name(ObjectClass *klass);
ObjectClass *object_class_by_name(const char *typename);
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
+ const char *implements_type, bool include_abstract,
void *opaque);
#endif
diff --git a/qom/object.c b/qom/object.c
index a12895fc99..3dabb1abb0 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -467,6 +467,8 @@ ObjectClass *object_class_by_name(const char *typename)
typedef struct OCFData
{
void (*fn)(ObjectClass *klass, void *opaque);
+ const char *implements_type;
+ bool include_abstract;
void *opaque;
} OCFData;
@@ -475,16 +477,28 @@ static void object_class_foreach_tramp(gpointer key, gpointer value,
{
OCFData *data = opaque;
TypeImpl *type = value;
+ ObjectClass *k;
type_class_init(type);
+ k = type->class;
- data->fn(value, type->class);
+ if (!data->include_abstract && type->abstract) {
+ return;
+ }
+
+ if (data->implements_type &&
+ !object_class_dynamic_cast(k, data->implements_type)) {
+ return;
+ }
+
+ data->fn(k, data->opaque);
}
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
+ const char *implements_type, bool include_abstract,
void *opaque)
{
- OCFData data = { fn, opaque };
+ OCFData data = { fn, implements_type, include_abstract, opaque };
g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);
}