Commit f7897430950ee94fb2dc4d6a5ca658d4909d9d85
1 parent
4af39611
Fix module initialization when more than 1 class is in use
Now that we're using enums for module types, it makes no sense to bother keeping a list of module types when we know exactly how many they are. Switching to an array simplifies the code and eliminates the aforementioned bug. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
2 changed files
with
26 additions
and
36 deletions
module.c
@@ -22,44 +22,36 @@ typedef struct ModuleEntry | @@ -22,44 +22,36 @@ typedef struct ModuleEntry | ||
22 | TAILQ_ENTRY(ModuleEntry) node; | 22 | TAILQ_ENTRY(ModuleEntry) node; |
23 | } ModuleEntry; | 23 | } ModuleEntry; |
24 | 24 | ||
25 | -typedef struct ModuleTypeList | ||
26 | -{ | ||
27 | - module_init_type type; | ||
28 | - TAILQ_HEAD(, ModuleEntry) entry_list; | ||
29 | - TAILQ_ENTRY(ModuleTypeList) node; | ||
30 | -} ModuleTypeList; | 25 | +typedef TAILQ_HEAD(, ModuleEntry) ModuleTypeList; |
31 | 26 | ||
32 | -static TAILQ_HEAD(, ModuleTypeList) init_type_list; | 27 | +static ModuleTypeList init_type_list[MODULE_INIT_MAX]; |
33 | 28 | ||
34 | -static ModuleTypeList *find_type_or_alloc(module_init_type type, int alloc) | 29 | +static void init_types(void) |
35 | { | 30 | { |
36 | - ModuleTypeList *n; | 31 | + static int inited; |
32 | + int i; | ||
37 | 33 | ||
38 | - TAILQ_FOREACH(n, &init_type_list, node) { | ||
39 | - if (type >= n->type) | ||
40 | - break; | 34 | + if (inited) { |
35 | + return; | ||
41 | } | 36 | } |
42 | 37 | ||
43 | - if (!n || n->type != type) { | ||
44 | - ModuleTypeList *o; | 38 | + for (i = 0; i < MODULE_INIT_MAX; i++) { |
39 | + TAILQ_INIT(&init_type_list[i]); | ||
40 | + } | ||
45 | 41 | ||
46 | - if (!alloc) | ||
47 | - return NULL; | 42 | + inited = 1; |
43 | +} | ||
48 | 44 | ||
49 | - o = qemu_mallocz(sizeof(*o)); | ||
50 | - o->type = type; | ||
51 | - TAILQ_INIT(&o->entry_list); | ||
52 | 45 | ||
53 | - if (n) { | ||
54 | - TAILQ_INSERT_AFTER(&init_type_list, n, o, node); | ||
55 | - } else { | ||
56 | - TAILQ_INSERT_HEAD(&init_type_list, o, node); | ||
57 | - } | 46 | +static ModuleTypeList *find_type(module_init_type type) |
47 | +{ | ||
48 | + ModuleTypeList *l; | ||
58 | 49 | ||
59 | - n = o; | ||
60 | - } | 50 | + init_types(); |
51 | + | ||
52 | + l = &init_type_list[type]; | ||
61 | 53 | ||
62 | - return n; | 54 | + return l; |
63 | } | 55 | } |
64 | 56 | ||
65 | void register_module_init(void (*fn)(void), module_init_type type) | 57 | void register_module_init(void (*fn)(void), module_init_type type) |
@@ -70,9 +62,9 @@ void register_module_init(void (*fn)(void), module_init_type type) | @@ -70,9 +62,9 @@ void register_module_init(void (*fn)(void), module_init_type type) | ||
70 | e = qemu_mallocz(sizeof(*e)); | 62 | e = qemu_mallocz(sizeof(*e)); |
71 | e->init = fn; | 63 | e->init = fn; |
72 | 64 | ||
73 | - l = find_type_or_alloc(type, 1); | 65 | + l = find_type(type); |
74 | 66 | ||
75 | - TAILQ_INSERT_TAIL(&l->entry_list, e, node); | 67 | + TAILQ_INSERT_TAIL(l, e, node); |
76 | } | 68 | } |
77 | 69 | ||
78 | void module_call_init(module_init_type type) | 70 | void module_call_init(module_init_type type) |
@@ -80,12 +72,9 @@ void module_call_init(module_init_type type) | @@ -80,12 +72,9 @@ void module_call_init(module_init_type type) | ||
80 | ModuleTypeList *l; | 72 | ModuleTypeList *l; |
81 | ModuleEntry *e; | 73 | ModuleEntry *e; |
82 | 74 | ||
83 | - l = find_type_or_alloc(type, 0); | ||
84 | - if (!l) { | ||
85 | - return; | ||
86 | - } | 75 | + l = find_type(type); |
87 | 76 | ||
88 | - TAILQ_FOREACH(e, &l->entry_list, node) { | 77 | + TAILQ_FOREACH(e, l, node) { |
89 | e->init(); | 78 | e->init(); |
90 | } | 79 | } |
91 | } | 80 | } |
module.h
@@ -17,12 +17,13 @@ | @@ -17,12 +17,13 @@ | ||
17 | /* This should not be used directly. Use block_init etc. instead. */ | 17 | /* This should not be used directly. Use block_init etc. instead. */ |
18 | #define module_init(function, type) \ | 18 | #define module_init(function, type) \ |
19 | static void __attribute__((constructor)) do_qemu_init_ ## function(void) { \ | 19 | static void __attribute__((constructor)) do_qemu_init_ ## function(void) { \ |
20 | - register_module_init(function, type); \ | 20 | + register_module_init(function, type); \ |
21 | } | 21 | } |
22 | 22 | ||
23 | typedef enum { | 23 | typedef enum { |
24 | MODULE_INIT_BLOCK, | 24 | MODULE_INIT_BLOCK, |
25 | - MODULE_INIT_DEVICE | 25 | + MODULE_INIT_DEVICE, |
26 | + MODULE_INIT_MAX | ||
26 | } module_init_type; | 27 | } module_init_type; |
27 | 28 | ||
28 | #define block_init(function) module_init(function, MODULE_INIT_BLOCK) | 29 | #define block_init(function) module_init(function, MODULE_INIT_BLOCK) |