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 * Contributions after 2012-01-13 are licensed under the terms of the 13 * GNU GPL, version 2 or (at your option) any later version. 14 */ 15 16#include "qemu-common.h" 17#include "qemu/queue.h" 18#include "qemu/module.h" 19 20typedef struct ModuleEntry 21{ 22 void (*init)(void); 23 QTAILQ_ENTRY(ModuleEntry) node; 24} ModuleEntry; 25 26typedef QTAILQ_HEAD(, ModuleEntry) ModuleTypeList; 27 28static ModuleTypeList init_type_list[MODULE_INIT_MAX]; 29 30static void init_types(void) 31{ 32 static int inited; 33 int i; 34 35 if (inited) { 36 return; 37 } 38 39 for (i = 0; i < MODULE_INIT_MAX; i++) { 40 QTAILQ_INIT(&init_type_list[i]); 41 } 42 43 inited = 1; 44} 45 46 47static ModuleTypeList *find_type(module_init_type type) 48{ 49 ModuleTypeList *l; 50 51 init_types(); 52 53 l = &init_type_list[type]; 54 55 return l; 56} 57 58void register_module_init(void (*fn)(void), module_init_type type) 59{ 60 ModuleEntry *e; 61 ModuleTypeList *l; 62 63 e = g_malloc0(sizeof(*e)); 64 e->init = fn; 65 66 l = find_type(type); 67 68 QTAILQ_INSERT_TAIL(l, e, node); 69} 70 71void module_call_init(module_init_type type) 72{ 73 ModuleTypeList *l; 74 ModuleEntry *e; 75 76 l = find_type(type); 77 78 QTAILQ_FOREACH(e, l, node) { 79 e->init(); 80 } 81} 82