On 3/12/21 10:31 AM, Claudio Fontana wrote: > Hello Paolo and all, > > while debugging a class init ordering issue, I noticed that > > _all_ class init functions for all types registered in the QEMU QOM are > called in select_machine(). > Expected? > > In particular it happens here: > > static MachineClass *select_machine(void) > { > GSList *machines = object_class_get_list(TYPE_MACHINE, false); > > > object_class_get_list() -> > object_class_foreach() -> > g_hash_table_foreach() -> > object_class_foreach_tramp -> > type_initialize(type); > > > Is this really desired? It looks suspect to me. > > (gdb) bt > #0 0x0000555555db613f in arm_v7m_class_init (oc=0x555556dca320, > data=0x555556a926e0 <arm_tcg_cpus+288>) > at ../target/arm/tcg/tcg-cpu-models.c:849 > #1 0x0000555555f1deba in type_initialize (ti=0x555556d5b2f0) at > ../qom/object.c:364 > #2 0x0000555555f1f62a in object_class_foreach_tramp (key=0x555556d5b470, > value=0x555556d5b2f0, opaque=0x7fffffffda20) > at ../qom/object.c:1069 > #3 0x00007ffff6562000 in g_hash_table_foreach () at > /usr/lib64/libglib-2.0.so.0 > #4 0x0000555555f1f709 in object_class_foreach (fn= > 0x555555f1f866 <object_class_get_list_tramp>, > implements_type=0x555556381b09 "machine", include_abstract=false, > opaque=0x7fffffffda70) > at ../qom/object.c:1091 > #5 0x0000555555f1f8e4 in object_class_get_list > (implements_type=0x555556381b09 "machine", include_abstract=false) at > ../qom/object.c:1148 > #6 0x0000555555debe94 in select_machine () at ../softmmu/vl.c:1607 > > > If not here, where should be the right place, for example, for CPU class > inits to be called? > > At the very least I would put a comment there around the beginning of > select_machine() saying: > > /* all types, all classes in QOM are initialized here, as a result of the > object_class_get_list call */ > > Wdyt?
Are you trying to register types conditionally?