Commit | Line | Data |
---|---|---|
9c312311 | 1 | /* This file is part of the Linux Trace Toolkit viewer |
2 | * Copyright (C) 2003-2004 Michel Dagenais | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License Version 2 as | |
6 | * published by the Free Software Foundation; | |
7 | * | |
8 | * This program is distributed in the hope that it will be useful, | |
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | * GNU General Public License for more details. | |
12 | * | |
13 | * You should have received a copy of the GNU General Public License | |
14 | * along with this program; if not, write to the Free Software | |
15 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, | |
16 | * MA 02111-1307, USA. | |
17 | */ | |
18 | ||
c5d77517 | 19 | #ifndef MODULES_H |
20 | #define MODULES_H | |
21 | ||
08b1c66e | 22 | #include <glib.h> |
c5d77517 | 23 | |
08b1c66e | 24 | /* A module contains some functionality which becomes available atfer it is |
25 | initialized and before it is destroyed. A module is characterized by a name, | |
26 | a description (short and long), a list of names of other modules on which | |
27 | it depends, and an initialization and a destruction function. | |
c5d77517 | 28 | |
08b1c66e | 29 | A library contains one or more modules and may be loaded dynamically. |
30 | The modules contained in a library are automatically registered through | |
31 | constructors which are called when the library is loaded. For modules | |
32 | directly linked with the main program (builtin), the constructors are | |
33 | called before the main program starts. (However, neither malloc nor glib | |
34 | functions are used during the registration process). | |
c5d77517 | 35 | |
08b1c66e | 36 | The library loading path is a set of directories, where requested |
37 | libraries and modules are searched for. | |
38 | */ | |
c5d77517 | 39 | |
dc877563 | 40 | typedef struct _LttvModule LttvModule; |
c5d77517 | 41 | |
08b1c66e | 42 | typedef struct _LttvLibrary LttvLibrary; |
43 | ||
44 | typedef void (*LttvModuleInit)(); | |
c5d77517 | 45 | |
dc877563 | 46 | typedef void (*LttvModuleDestroy)(); |
c5d77517 | 47 | |
08b1c66e | 48 | typedef struct _LttvModuleInfo |
49 | { | |
90e19f82 AM |
50 | char *name; |
51 | char *short_description; | |
52 | char *description; | |
53 | LttvModuleInit init; | |
54 | LttvModuleDestroy destroy; | |
55 | LttvLibrary *library; | |
56 | unsigned require_count; | |
57 | unsigned use_count; | |
58 | unsigned prerequisites_number; | |
08b1c66e | 59 | } LttvModuleInfo; |
60 | ||
61 | ||
62 | typedef struct _LttvLibraryInfo | |
63 | { | |
90e19f82 AM |
64 | char *name; |
65 | char *path; | |
66 | unsigned load_count; | |
08b1c66e | 67 | } LttvLibraryInfo; |
68 | ||
69 | ||
70 | typedef enum _LttvModuleError | |
71 | { | |
90e19f82 AM |
72 | LTTV_MODULE_NOT_FOUND, |
73 | LTTV_MODULE_NO_INIT | |
08b1c66e | 74 | } LttvModuleError; |
75 | ||
76 | ||
77 | /* Insure that a module is loaded and initialized. Require count | |
78 | (number of times the module was required) and use count | |
79 | (number of times required or used as prerequisite) serve to | |
80 | insure that a module is destroyed only after it has been released | |
81 | as many times as it was required (and prerequired). | |
82 | ||
83 | The module is searched among the modules currently loaded, then as a | |
84 | similarly named library to load which should contain the named module. | |
85 | If the module cannot be found or loaded, NULL is returned and an | |
86 | explanation is provided in error. */ | |
87 | ||
88 | LttvModule *lttv_module_require(char *name, GError **error); | |
89 | ||
90 | void lttv_module_release(LttvModule *m); | |
91 | ||
92 | ||
93 | /* Obtain information about the module, including the containing library */ | |
94 | ||
95 | void lttv_module_info(LttvModule *m, LttvModuleInfo *info); | |
96 | ||
97 | ||
98 | /* List the modules on which this module depends */ | |
99 | ||
100 | unsigned lttv_module_prerequisite_number(LttvModule *m); | |
101 | ||
102 | LttvModule *lttv_module_prerequisite_get(LttvModule *m, unsigned i); | |
103 | ||
104 | ||
105 | /* Insure that a library is loaded. A load count insures that a library | |
106 | is unloaded only after it has been asked to unload as | |
107 | many times as it was loaded, and its modules are not in use. The library | |
108 | is searched along the library path if name is a relative pathname. | |
109 | If the library cannot be found or loaded, NULL is returned and an | |
110 | explanation is provided in error. */ | |
111 | ||
112 | LttvLibrary *lttv_library_load(char *name, GError **error); | |
c5d77517 | 113 | |
0bd2f89c | 114 | /* Returns 0 if library is unloaded, > 0 otherwise */ |
115 | gint lttv_library_unload(LttvLibrary *l); | |
c5d77517 | 116 | |
c5d77517 | 117 | |
08b1c66e | 118 | /* Obtain information about the library */ |
c5d77517 | 119 | |
08b1c66e | 120 | void lttv_library_info(LttvLibrary *l, LttvLibraryInfo *info); |
c5d77517 | 121 | |
c5d77517 | 122 | |
08b1c66e | 123 | /* List the modules contained in a library */ |
c5d77517 | 124 | |
08b1c66e | 125 | unsigned lttv_library_module_number(LttvLibrary *l); |
c5d77517 | 126 | |
08b1c66e | 127 | LttvModule *lttv_library_module_get(LttvLibrary *l, unsigned i); |
c5d77517 | 128 | |
c5d77517 | 129 | |
08b1c66e | 130 | /* List the currently loaded libraries */ |
c5d77517 | 131 | |
08b1c66e | 132 | unsigned lttv_library_number(); |
c5d77517 | 133 | |
08b1c66e | 134 | LttvLibrary *lttv_library_get(unsigned i); |
c5d77517 | 135 | |
c5d77517 | 136 | |
c5d77517 | 137 | |
08b1c66e | 138 | /* Add or remove directory names to the library search path */ |
dc877563 | 139 | |
224446ce | 140 | void lttv_library_path_add(const char *name); |
dc877563 | 141 | |
224446ce | 142 | void lttv_library_path_remove(const char *name); |
08b1c66e | 143 | |
144 | ||
145 | /* List the directory names in the library search path */ | |
146 | ||
147 | unsigned lttv_library_path_number(); | |
148 | ||
149 | char *lttv_library_path_get(unsigned i); | |
150 | ||
151 | ||
152 | /* To define a module, simply call the LTTV_MODULE macro with the needed | |
153 | arguments: single word name, one line short description, larger | |
154 | description, initialization function, destruction function, and | |
155 | list of names for required modules (e.g., "moduleA", "moduleB"). | |
156 | This will insure that the module is registered at library load time. | |
157 | ||
158 | Example: | |
159 | ||
160 | LTTV_MODULE("option", "Command line options processing", "...", \ | |
161 | init, destroy, "moduleA", "moduleB") | |
162 | */ | |
163 | ||
164 | #define LTTV_MODULE(name, short_desc, desc, init, destroy, ...) \ | |
90e19f82 AM |
165 | \ |
166 | static void _LTTV_MODULE_REGISTER(__LINE__)() \ | |
167 | __attribute__((constructor)); \ | |
168 | \ | |
169 | static void _LTTV_MODULE_REGISTER(__LINE__)() \ | |
170 | { \ | |
171 | static char *module_prerequisites[] = { __VA_ARGS__ }; \ | |
172 | \ | |
173 | static struct _LttvModuleDescription module = { \ | |
174 | name, short_desc, desc, init, destroy, \ | |
175 | sizeof(module_prerequisites) / sizeof(char *), \ | |
176 | module_prerequisites, NULL}; \ | |
177 | \ | |
178 | lttv_module_register(&module); \ | |
179 | } | |
08b1c66e | 180 | |
181 | ||
182 | /* Internal structure and function used to register modules, called by | |
183 | LTTV_MODULE */ | |
184 | ||
185 | #define __LTTV_MODULE_REGISTER(line) _lttv_module_register_ ## line | |
186 | #define _LTTV_MODULE_REGISTER(line) __LTTV_MODULE_REGISTER(line) | |
187 | ||
188 | struct _LttvModuleDescription | |
189 | { | |
90e19f82 AM |
190 | char *name; |
191 | char *short_description; | |
192 | char *description; | |
193 | LttvModuleInit init; | |
194 | LttvModuleDestroy destroy; | |
195 | unsigned prerequisites_number; | |
196 | char **prerequisites; | |
197 | struct _LttvModuleDescription *next; | |
08b1c66e | 198 | }; |
199 | ||
200 | void lttv_module_register(struct _LttvModuleDescription *d); | |
c5d77517 | 201 | |
202 | #endif // MODULES_H | |
08b1c66e | 203 | |
204 | ||
205 | ||
206 | ||
207 | ||
208 |