From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:33546) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RsZnP-0004Hn-1F for qemu-devel@nongnu.org; Wed, 01 Feb 2012 08:00:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RsZn7-0005Ks-9B for qemu-devel@nongnu.org; Wed, 01 Feb 2012 08:00:17 -0500 Received: from cantor2.suse.de ([195.135.220.15]:37160 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RsZn7-0005Kd-1Q for qemu-devel@nongnu.org; Wed, 01 Feb 2012 08:00:01 -0500 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Wed, 1 Feb 2012 13:57:18 +0100 Message-Id: <1328101045-10717-2-git-send-email-afaerber@suse.de> In-Reply-To: <1328101045-10717-1-git-send-email-afaerber@suse.de> References: <1328101045-10717-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH RFC v2 1/8] qom: Allow object_class_foreach() to take additional parameters to refine search List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori , =?UTF-8?q?Andreas=20F=C3=A4rber?= From: Anthony Liguori Signed-off-by: Anthony Liguori Signed-off-by: Andreas F=C3=A4rber --- include/qemu/object.h | 1 + qom/object.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/qemu/object.h b/include/qemu/object.h index ba37850..adbcfb1 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); =20 void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), + const char *implements_type, bool include_abst= ract, void *opaque); =20 #endif diff --git a/qom/object.c b/qom/object.c index a12895f..3dabb1a 100644 --- a/qom/object.c +++ b/qom/object.c @@ -467,6 +467,8 @@ ObjectClass *object_class_by_name(const char *typenam= e) typedef struct OCFData { void (*fn)(ObjectClass *klass, void *opaque); + const char *implements_type; + bool include_abstract; void *opaque; } OCFData; =20 @@ -475,16 +477,28 @@ static void object_class_foreach_tramp(gpointer key= , gpointer value, { OCFData *data =3D opaque; TypeImpl *type =3D value; + ObjectClass *k; =20 type_class_init(type); + k =3D type->class; =20 - data->fn(value, type->class); + if (!data->include_abstract && type->abstract) { + return; + } + + if (data->implements_type &&=20 + !object_class_dynamic_cast(k, data->implements_type)) { + return; + } + + data->fn(k, data->opaque); } =20 void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), + const char *implements_type, bool include_abst= ract, void *opaque) { - OCFData data =3D { fn, opaque }; + OCFData data =3D { fn, implements_type, include_abstract, opaque }; =20 g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &= data); } --=20 1.7.7