Statistics
| Branch: | Revision:

root / util / module.c @ 9adea5f7

History | View | Annotate | Download (1.4 kB)

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