From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:48728) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SF1ip-00080k-Vo for qemu-devel@nongnu.org; Tue, 03 Apr 2012 07:16:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SF1ij-00039T-Fi for qemu-devel@nongnu.org; Tue, 03 Apr 2012 07:16:23 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:61671) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SF1ij-000393-5u for qemu-devel@nongnu.org; Tue, 03 Apr 2012 07:16:17 -0400 Received: by mail-pb0-f45.google.com with SMTP id uo5so6178795pbc.4 for ; Tue, 03 Apr 2012 04:16:16 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 3 Apr 2012 13:15:30 +0200 Message-Id: <1333451753-3550-3-git-send-email-pbonzini@redhat.com> In-Reply-To: <1333451753-3550-1-git-send-email-pbonzini@redhat.com> References: <1333451753-3550-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 02/25] qom: add object_child_foreach List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, afaerber@suse.de A utility function that will be used to implement hierarchical realization. Signed-off-by: Paolo Bonzini --- include/qemu/object.h | 14 +++++++++++++- qom/object.c | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/qemu/object.h b/include/qemu/object.h index f814521..470efe3 100644 --- a/include/qemu/object.h +++ b/include/qemu/object.h @@ -918,6 +918,19 @@ void object_property_add_str(Object *obj, const char *name, struct Error **errp); /** + * object_child_foreach: + * @obj: the object whose children will be navigated + * @fn: the iterator function to be called + * @opaque: an opaque value that will be passed to the iterator + * + * Call @fn passing each child of @obj and @opaque to it, until @fn returns + * non-zero. Return the last value returned by @fn, or 0 if there is no + * child. + */ +int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), + void *opaque); + +/** * container_get: * @path: path to the container * @@ -928,5 +941,4 @@ void object_property_add_str(Object *obj, const char *name, */ Object *container_get(const char *path); - #endif diff --git a/qom/object.c b/qom/object.c index 3e9fed7..4975d93 100644 --- a/qom/object.c +++ b/qom/object.c @@ -597,6 +597,23 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data); } +int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), + void *opaque) +{ + ObjectProperty *prop; + int ret = 0; + + QTAILQ_FOREACH(prop, &obj->properties, node) { + if (strstart(prop->type, "child<", NULL)) { + ret = fn(prop->opaque, opaque); + if (ret != 0) { + break; + } + } + } + return ret; +} + static void object_class_get_list_tramp(ObjectClass *klass, void *opaque) { GSList **list = opaque; -- 1.7.9.3