Lines Matching defs:module

11 #include "module.h"
47 /* Each known module will have this structure which is put in the
51 struct module {
52 struct module *next;
58 module_state state; /* state of module */
67 * they have to wait for each other, i.e. we need one lock per module;
72 /* we store the loaded modules by directory path, and all known modules by module name
78 /** calculates hash for a module using its name */
83 module *module = (struct module *)_module;
86 if (module != NULL)
87 return hash_hash_string(module->name) % range;
96 /** compares a module to a given name */
101 module *module = (struct module *)_module;
106 return fssh_strcmp(module->name, name);
111 inc_module_ref_count(struct module *module)
113 module->ref_count++;
118 dec_module_ref_count(struct module *module)
120 module->ref_count--;
129 create_module(fssh_module_info *info, const char *file, int offset, module **_module)
131 module *module;
139 module = (struct module *)hash_lookup(sModulesHash, info->name);
140 if (module) {
141 FATAL(("Duplicate module name (%s) detected... ignoring new one\n", info->name));
145 if ((module = (struct module *)malloc(sizeof(struct module))) == NULL)
150 module->name = fssh_strdup(info->name);
151 if (module->name == NULL) {
152 free(module);
156 module->file = fssh_strdup(file);
157 if (module->file == NULL) {
158 free(module->name);
159 free(module);
163 module->state = MODULE_QUERIED;
164 module->info = info;
165 module->offset = offset;
167 module->ref_count = 0;
168 module->flags = info->flags;
171 hash_insert(sModulesHash, module);
175 *_module = module;
181 /** Initializes a loaded module depending on its state */
184 init_module(module *module)
186 switch (module->state) {
191 module->state = MODULE_INIT;
193 // init module
195 TRACE(("initializing module %s (at %p)... \n", module->name, module->info->std_ops));
196 status = module->info->std_ops(FSSH_B_MODULE_INIT);
200 module->state = MODULE_READY;
202 module->state = MODULE_LOADED;
212 FATAL(("circular reference to %s\n", module->name));
216 FATAL(("tried to load module %s which is currently unloading\n", module->name));
220 FATAL(("cannot load module %s because its earlier unloading failed\n", module->name));
230 /** Uninitializes a module depeding on its state */
233 uninit_module(module *module)
235 TRACE(("uninit_module(%s)\n", module->name));
237 switch (module->state) {
243 fssh_panic("Trying to unload module %s which is initializing\n", module->name);
247 fssh_panic("Trying to unload module %s which is un-initializing\n", module->name);
254 module->state = MODULE_UNINIT;
256 TRACE(("uninitializing module %s...\n", module->name));
257 status = module->info->std_ops(FSSH_B_MODULE_UNINIT);
261 module->state = MODULE_LOADED;
265 FATAL(("Error unloading module %s (%s)\n", module->name, fssh_strerror(status)));
267 module->state = MODULE_ERROR;
268 module->flags |= FSSH_B_KEEP_LOADED;
286 fssh_dprintf("creation of built-in module \"%s\" failed!\n", info->name);
294 struct module *module;
299 while ((module = (struct module *)hash_next(sModulesHash, &iterator)) != NULL) {
301 module, module->name, module->file, (int)module->offset, (int)module->ref_count,
302 module->state);
313 /** Setup the module structures and data for use - must be called
314 * before any other module call.
345 module *module;
355 module = (struct module *)hash_lookup(sModulesHash, path);
356 if (module == NULL)
361 if (module->ref_count == 0)
362 status = init_module(module);
367 inc_module_ref_count(module);
368 *_info = module->info;
383 module *module;
389 module = (struct module *)hash_lookup(sModulesHash, path);
390 if (module == NULL) {
391 FATAL(("module: We don't seem to have a reference to module %s\n", path));
396 if ((module->flags & FSSH_B_KEEP_LOADED) == 0) {
397 dec_module_ref_count(module);
399 if (module->ref_count == 0)
400 uninit_module(module);