summaryrefslogtreecommitdiffstats
path: root/src/module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/module.c')
-rw-r--r--src/module.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/module.c b/src/module.c
index 0be7f5ed..c6de1751 100644
--- a/src/module.c
+++ b/src/module.c
@@ -17,6 +17,9 @@ struct module* module_load(struct core *c, const char *name, const char *argumen
m = malloc(sizeof(struct module));
assert(m);
+ m->name = strdup(name);
+ m->argument = argument ? strdup(argument) : NULL;
+
if (!(m->dl = lt_dlopenext(name)))
goto fail;
@@ -26,8 +29,6 @@ struct module* module_load(struct core *c, const char *name, const char *argumen
if (!(m->done = lt_dlsym(m->dl, "module_done")))
goto fail;
- m->name = strdup(name);
- m->argument = argument ? strdup(argument) : NULL;
m->userdata = NULL;
m->core = c;
@@ -127,3 +128,28 @@ char *module_list_to_string(struct core *c) {
return strbuf_tostring_free(s);
}
+
+
+struct once_info {
+ struct core *core;
+ uint32_t index;
+};
+
+
+void module_unload_once_callback(void *userdata) {
+ struct once_info *i = userdata;
+ assert(i);
+ module_unload_by_index(i->core, i->index);
+ free(i);
+}
+
+void module_unload_request(struct core *c, struct module *m) {
+ struct once_info *i;
+ assert(c && m);
+
+ i = malloc(sizeof(struct once_info));
+ assert(i);
+ i->core = c;
+ i->index = m->index;
+ mainloop_once(c->mainloop, module_unload_once_callback, i);
+}