From: Anthony Liguori Date: Thu, 22 Dec 2011 20:11:53 +0000 (-0600) Subject: qom: allow object_class_foreach to take additional parameters to refine search X-Git-Tag: qemu-xen-4.3.0-rc1~1587 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=93c511a1adad281492f18b13e164ae4ac790c052;p=qemu-xen.git qom: allow object_class_foreach to take additional parameters to refine search Signed-off-by: Anthony Liguori --- 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); }