qom: add helper macro DEFINE_TYPES()
DEFINE_TYPES() will help to simplify following routine patterns: static void foo_register_types(void) { type_register_static(&foo1_type_info); type_register_static(&foo2_type_info); ... } type_init(foo_register_types) or static void foo_register_types(void) { int i; for (i = 0; i < ARRAY_SIZE(type_infos); i++) { type_register_static(&type_infos[i]); } } type_init(foo_register_types) with a single line DEFINE_TYPES(type_infos) where types have static definition which could be consolidated in a single array of TypeInfo structures. It saves us ~6-10LOC per use case and would help to replace imperative foo_register_types() there with declarative style of type registration. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
aa04c9d207
commit
38b5d79b2e
@ -79,6 +79,28 @@ typedef struct InterfaceInfo InterfaceInfo;
|
||||
* #TypeInfo describes information about the type including what it inherits
|
||||
* from, the instance and class size, and constructor/destructor hooks.
|
||||
*
|
||||
* Alternatively several static types could be registered using helper macro
|
||||
* DEFINE_TYPES()
|
||||
*
|
||||
* <example>
|
||||
* <programlisting>
|
||||
* static const TypeInfo device_types_info[] = {
|
||||
* {
|
||||
* .name = TYPE_MY_DEVICE_A,
|
||||
* .parent = TYPE_DEVICE,
|
||||
* .instance_size = sizeof(MyDeviceA),
|
||||
* },
|
||||
* {
|
||||
* .name = TYPE_MY_DEVICE_B,
|
||||
* .parent = TYPE_DEVICE,
|
||||
* .instance_size = sizeof(MyDeviceB),
|
||||
* },
|
||||
* };
|
||||
*
|
||||
* DEFINE_TYPES(device_types_info)
|
||||
* </programlisting>
|
||||
* </example>
|
||||
*
|
||||
* Every type has an #ObjectClass associated with it. #ObjectClass derivatives
|
||||
* are instantiated dynamically but there is only ever one instance for any
|
||||
* given type. The #ObjectClass typically holds a table of function pointers
|
||||
@ -798,6 +820,20 @@ Type type_register(const TypeInfo *info);
|
||||
*/
|
||||
void type_register_static_array(const TypeInfo *infos, int nr_infos);
|
||||
|
||||
/**
|
||||
* DEFINE_TYPES:
|
||||
* @type_array: The array containing #TypeInfo structures to register
|
||||
*
|
||||
* @type_array should be static constant that exists for the life time
|
||||
* that the type is registered.
|
||||
*/
|
||||
#define DEFINE_TYPES(type_array) \
|
||||
static void do_qemu_init_ ## type_array(void) \
|
||||
{ \
|
||||
type_register_static_array(type_array, ARRAY_SIZE(type_array)); \
|
||||
} \
|
||||
type_init(do_qemu_init_ ## type_array)
|
||||
|
||||
/**
|
||||
* object_class_dynamic_cast_assert:
|
||||
* @klass: The #ObjectClass to attempt to cast.
|
||||
|
Loading…
Reference in New Issue
Block a user