From 2934dc9fcaa28af8ab035bae8c447621eadcd7a7 Mon Sep 17 00:00:00 2001 From: markster Date: Fri, 13 Apr 2001 04:06:31 +0000 Subject: Version 0.1.8 from FTP git-svn-id: http://svn.digium.com/svn/asterisk/trunk@281 f38db490-d61c-443f-a65b-d21fe96a405b --- include/asterisk/module.h | 5 ++++- loader.c | 55 +++++++++++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/include/asterisk/module.h b/include/asterisk/module.h index 9a8a7153c..59689ba0b 100755 --- a/include/asterisk/module.h +++ b/include/asterisk/module.h @@ -27,7 +27,7 @@ int usecount(void); /* How many channels provided by this module are in use? * char *description(void); /* Description of this module */ char *key(void); /* Return the below mentioned key, unmodified */ -int reload(void); +int reload(void); /* reload configs */ #define ASTERISK_GPL_KEY \ "This paragraph is Copyright (C) 2000, Linux Support Services, Inc. \ @@ -61,6 +61,9 @@ int ast_loader_register(int (*updater)(void)); /* No longer run me when modules are updated */ int ast_loader_unregister(int (*updater)(void)); +/* Reload all modules */ +void ast_module_reload(void); + /* Local user routines keep track of which channels are using a given module resource. They can help make removing modules safer, particularly if they're in use at the time they have been requested to be removed */ diff --git a/loader.c b/loader.c index b216a07bc..8293993f3 100755 --- a/loader.c +++ b/loader.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #define __USE_GNU @@ -93,7 +94,7 @@ int ast_unload_resource(char *resource_name, int force) { 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) { @@ -103,7 +104,7 @@ int ast_unload_resource(char *resource_name, int force) 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; } } @@ -111,7 +112,7 @@ int ast_unload_resource(char *resource_name, int force) 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"); @@ -126,11 +127,27 @@ int ast_unload_resource(char *resource_name, int force) 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]; @@ -154,13 +171,13 @@ int ast_load_resource(char *resource_name) 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; @@ -168,7 +185,7 @@ int ast_load_resource(char *resource_name) 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)); @@ -181,7 +198,7 @@ int ast_load_resource(char *resource_name) 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"); @@ -223,7 +240,7 @@ int ast_load_resource(char *resource_name) 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) { @@ -238,7 +255,7 @@ int ast_load_resource(char *resource_name) 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); @@ -251,7 +268,7 @@ int ast_load_resource(char *resource_name) 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) { @@ -259,7 +276,7 @@ static int ast_resource_exists(char *resource) break; m = m->next; } - pthread_mutex_unlock(&modlock); + ast_pthread_mutex_unlock(&modlock); if (m) return -1; else @@ -352,14 +369,14 @@ void ast_update_use_count(void) /* 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); } @@ -375,7 +392,7 @@ int ast_update_module_list(int (*modentry)(char *module, char *description, int m = m->next; } if (unlock) - pthread_mutex_unlock(&modlock); + ast_pthread_mutex_unlock(&modlock); return 0; } @@ -385,11 +402,11 @@ int ast_loader_register(int (*v)(void)) /* 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; @@ -399,7 +416,7 @@ int ast_loader_unregister(int (*v)(void)) { 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) { @@ -415,6 +432,6 @@ int ast_loader_unregister(int (*v)(void)) } if (tmp) res = 0; - pthread_mutex_unlock(&modlock); + ast_pthread_mutex_unlock(&modlock); return res; } -- cgit v1.2.3