Commit 93c511a1 authored by Anthony Liguori's avatar Anthony Liguori

qom: allow object_class_foreach to take additional parameters to refine search

Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 18b6dade
......@@ -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
......@@ -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);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment