Home | History | Annotate | Download | only in qemu
      1 /*
      2  * QEMU Module Infrastructure
      3  *
      4  * Copyright IBM, Corp. 2009
      5  *
      6  * Authors:
      7  *  Anthony Liguori   <aliguori (at) 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 
     29 static 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 
     46 static 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 
     57 void 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 
     70 void 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