#include <asterisk/options.h>
#include <asterisk/config.h>
#include <asterisk/logger.h>
+#include <asterisk/channel.h>
#include <dlfcn.h>
#include <asterisk/md5.h>
#define __USE_GNU
{
struct module *m, *ml = NULL;
int res = -1;
- if (pthread_mutex_lock(&modlock))
+ if (ast_pthread_mutex_lock(&modlock))
ast_log(LOG_WARNING, "Failed to lock\n");
m = module_list;
while(m) {
ast_log(LOG_WARNING, "Warning: Forcing removal of module %s with use count %d\n", resource_name, res);
else {
ast_log(LOG_WARNING, "Soft unload failed, '%s' has use count %d\n", resource_name, res);
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return -1;
}
}
if (res) {
ast_log(LOG_WARNING, "Firm unload failed for %s\n", resource_name);
if (force <= AST_FORCE_FIRM) {
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return -1;
} else
ast_log(LOG_WARNING, "** Dangerous **: Unloading resource anyway, at user request\n");
ml = m;
m = m->next;
}
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
ast_update_use_count();
return res;
}
+void ast_module_reload(void)
+{
+ struct module *m;
+ ast_pthread_mutex_lock(&modlock);
+ m = module_list;
+ while(m) {
+ if (m->reload) {
+ if (option_verbose > 2)
+ ast_verbose(VERBOSE_PREFIX_3 "Reloading module '%s' (%s)\n", m->resource, m->description());
+ m->reload();
+ }
+ m = m->next;
+ }
+ ast_pthread_mutex_unlock(&modlock);
+}
+
int ast_load_resource(char *resource_name)
{
static char fn[256];
ast_destroy(cfg);
}
- if (pthread_mutex_lock(&modlock))
+ if (ast_pthread_mutex_lock(&modlock))
ast_log(LOG_WARNING, "Failed to lock\n");
m = module_list;
while(m) {
if (!strcasecmp(m->resource, resource_name)) {
ast_log(LOG_WARNING, "Module '%s' already exists\n", resource_name);
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return -1;
}
m = m->next;
m = malloc(sizeof(struct module));
if (!m) {
ast_log(LOG_WARNING, "Out of memory\n");
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return -1;
}
strncpy(m->resource, resource_name, sizeof(m->resource));
if (!m->lib) {
ast_log(LOG_WARNING, "%s\n", dlerror());
free(m);
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return -1;
}
m->load_module = dlsym(m->lib, "load_module");
ast_log(LOG_WARNING, "%d error(s) loading module %s, aborted\n", errors, fn);
dlclose(m->lib);
free(m);
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return -1;
}
if (!fully_booted) {
m->next = module_list;
module_list = m;
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
if ((res = m->load_module())) {
ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, res);
ast_unload_resource(resource_name, 0);
static int ast_resource_exists(char *resource)
{
struct module *m;
- if (pthread_mutex_lock(&modlock))
+ if (ast_pthread_mutex_lock(&modlock))
ast_log(LOG_WARNING, "Failed to lock\n");
m = module_list;
while(m) {
break;
m = m->next;
}
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
if (m)
return -1;
else
/* Notify any module monitors that the use count for a
resource has changed */
struct loadupdate *m;
- if (pthread_mutex_lock(&modlock))
+ if (ast_pthread_mutex_lock(&modlock))
ast_log(LOG_WARNING, "Failed to lock\n");
m = updaters;
while(m) {
m->updater();
m = m->next;
}
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
}
m = m->next;
}
if (unlock)
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return 0;
}
/* XXX Should be more flexible here, taking > 1 verboser XXX */
if ((tmp = malloc(sizeof (struct loadupdate)))) {
tmp->updater = v;
- if (pthread_mutex_lock(&modlock))
+ if (ast_pthread_mutex_lock(&modlock))
ast_log(LOG_WARNING, "Failed to lock\n");
tmp->next = updaters;
updaters = tmp;
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return 0;
}
return -1;
{
int res = -1;
struct loadupdate *tmp, *tmpl=NULL;
- if (pthread_mutex_lock(&modlock))
+ if (ast_pthread_mutex_lock(&modlock))
ast_log(LOG_WARNING, "Failed to lock\n");
tmp = updaters;
while(tmp) {
}
if (tmp)
res = 0;
- pthread_mutex_unlock(&modlock);
+ ast_pthread_mutex_unlock(&modlock);
return res;
}