1 /* 2 * QEMU Module Infrastructure 3 * 4 * Copyright IBM, Corp. 2009 5 * 6 * Authors: 7 * Anthony Liguori <aliguori@us.ibm.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2. See 10 * the COPYING file in the top-level directory. 11 * 12 */ 13 14 #include "qemu-common.h" 15 #include "qemu-queue.h" 16 #include "module.h" 17 18 typedef struct ModuleEntry 19 { 20 module_init_type type; 21 void (*init)(void); 22 QTAILQ_ENTRY(ModuleEntry) node; 23 } ModuleEntry; 24 25 typedef QTAILQ_HEAD(, ModuleEntry) ModuleTypeList; 26 27 static ModuleTypeList init_type_list[MODULE_INIT_MAX]; 28 init_types(void)29static void init_types(void) 30 { 31 static int inited; 32 int i; 33 34 if (inited) { 35 return; 36 } 37 38 for (i = 0; i < MODULE_INIT_MAX; i++) { 39 QTAILQ_INIT(&init_type_list[i]); 40 } 41 42 inited = 1; 43 } 44 45 find_type(module_init_type type)46static ModuleTypeList *find_type(module_init_type type) 47 { 48 ModuleTypeList *l; 49 50 init_types(); 51 52 l = &init_type_list[type]; 53 54 return l; 55 } 56 register_module_init(void (* fn)(void),module_init_type type)57void register_module_init(void (*fn)(void), module_init_type type) 58 { 59 ModuleEntry *e; 60 ModuleTypeList *l; 61 62 e = qemu_mallocz(sizeof(*e)); 63 e->init = fn; 64 65 l = find_type(type); 66 67 QTAILQ_INSERT_TAIL(l, e, node); 68 } 69 module_call_init(module_init_type type)70void module_call_init(module_init_type type) 71 { 72 ModuleTypeList *l; 73 ModuleEntry *e; 74 75 l = find_type(type); 76 77 QTAILQ_FOREACH(e, l, node) { 78 e->init(); 79 } 80 } 81