~ahs3/+junk/cq-qemu

« back to all changes in this revision

Viewing changes to module.c

  • Committer: Al Stone
  • Date: 2012-02-09 01:17:20 UTC
  • Revision ID: albert.stone@canonical.com-20120209011720-tztl7ik3qayz80p4
first commit to bzr for qemu

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 = g_malloc0(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
}