mirror of https://github.com/xqemu/xqemu.git
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);
|
ObjectClass *object_class_by_name(const char *typename);
|
||||||
|
|
||||||
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
|
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
|
||||||
|
const char *implements_type, bool include_abstract,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
18
qom/object.c
18
qom/object.c
|
@ -467,6 +467,8 @@ ObjectClass *object_class_by_name(const char *typename)
|
||||||
typedef struct OCFData
|
typedef struct OCFData
|
||||||
{
|
{
|
||||||
void (*fn)(ObjectClass *klass, void *opaque);
|
void (*fn)(ObjectClass *klass, void *opaque);
|
||||||
|
const char *implements_type;
|
||||||
|
bool include_abstract;
|
||||||
void *opaque;
|
void *opaque;
|
||||||
} OCFData;
|
} OCFData;
|
||||||
|
|
||||||
|
@ -475,16 +477,28 @@ static void object_class_foreach_tramp(gpointer key, gpointer value,
|
||||||
{
|
{
|
||||||
OCFData *data = opaque;
|
OCFData *data = opaque;
|
||||||
TypeImpl *type = value;
|
TypeImpl *type = value;
|
||||||
|
ObjectClass *k;
|
||||||
|
|
||||||
type_class_init(type);
|
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),
|
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
|
||||||
|
const char *implements_type, bool include_abstract,
|
||||||
void *opaque)
|
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);
|
g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue