qom: allow object_class_foreach to take additional parameters to refine search
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
18b6dade8c
commit
93c511a1ad
@ -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
|
||||
|
18
qom/object.c
18
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user