File:  [Qemu by Fabrice Bellard] / qemu / module.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:34:13 2018 UTC (17 months, 2 weeks ago) by root
Branches: qemu, MAIN
CVS tags: qemu1000, qemu0151, qemu0150, qemu0141, qemu0140, qemu0130, qemu0125, qemu0124, qemu0123, qemu0122, qemu0121, qemu0120, HEAD
qemu 0.12.0

    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: 
   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: }

unix.superglobalmegacorp.com