Am 25.02.2012 23:07, schrieb Andreas Färber: > This function allows to obtain a singly-linked list of classes, which > can be sorted by the caller. > > Signed-off-by: Andreas Färber <afaer...@suse.de> > Cc: Anthony Liguori <anth...@codemonkey.ws> > --- > v1 -> v2: > * Instead of object_class_foreach() using a GCompareFunc with a GTree > internally,
Err, should've been object_class_foreach_ordered(); object_class_foreach() does continue to exist. ;) Andreas > return a GSList so that the caller can sort herself (suggested by Anthony). > * Add documentation. > > include/qemu/object.h | 11 +++++++++++ > qom/object.c | 17 +++++++++++++++++ > 2 files changed, 28 insertions(+), 0 deletions(-) > > diff --git a/include/qemu/object.h b/include/qemu/object.h > index 69e4b7b..ddc3b81 100644 > --- a/include/qemu/object.h > +++ b/include/qemu/object.h > @@ -560,6 +560,17 @@ 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); > + > +/** > + * object_class_get_list: > + * @implements_type: The type to filter for, including its derivatives. > + * @include_abstract: Whether to include abstract classes. > + * > + * Returns: A singly-linked list of the classes in reverse hashtable order. > + */ > +GSList *object_class_get_list(const char *implements_type, > + bool include_abstract); > + > /** > * object_ref: > * @obj: the object > diff --git a/qom/object.c b/qom/object.c > index aa037d2..eef0b22 100644 > --- a/qom/object.c > +++ b/qom/object.c > @@ -572,6 +572,23 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, > void *opaque), > g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, > &data); > } > > +static void object_class_get_list_tramp(ObjectClass *klass, void *opaque) > +{ > + GSList **list = opaque; > + > + *list = g_slist_prepend(*list, klass); > +} > + > +GSList *object_class_get_list(const char *implements_type, > + bool include_abstract) > +{ > + GSList *list = NULL; > + > + object_class_foreach(object_class_get_list_tramp, > + implements_type, include_abstract, &list); > + return list; > +} > + > void object_ref(Object *obj) > { > obj->ref++; -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg