aboutsummaryrefslogtreecommitdiffstats
path: root/loader.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-11-17 13:40:47 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-11-17 13:40:47 +0000
commit6b4b4c491eccbffde6432cafe08b09af6cecdf45 (patch)
treee9fc78de6436137f4d329c2ff742fb720c393e43 /loader.c
parentd6a6fed8b87cecdf5f139f9b4cd0de1fd2bc51a2 (diff)
Don't hold modlock while doing reload
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4276 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'loader.c')
-rwxr-xr-xloader.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/loader.c b/loader.c
index 5280d5a50..5ac59a02d 100755
--- a/loader.c
+++ b/loader.c
@@ -103,6 +103,7 @@ AST_MUTEX_DEFINE_STATIC(modlock);
AST_MUTEX_DEFINE_STATIC(reloadlock);
static struct module *module_list=NULL;
+static int modlistver = 0;
int ast_unload_resource(char *resource_name, int force)
{
@@ -142,6 +143,7 @@ int ast_unload_resource(char *resource_name, int force)
ml = m;
m = m->next;
}
+ modlistver = rand();
ast_mutex_unlock(&modlock);
ast_update_use_count();
return res;
@@ -190,6 +192,8 @@ int ast_module_reload(const char *name)
{
struct module *m;
int reloaded = 0;
+ int oldversion;
+ int (*reload)(void);
/* We'll do the logger and manager the favor of calling its reload here first */
if (ast_mutex_trylock(&reloadlock)) {
@@ -215,17 +219,23 @@ int ast_module_reload(const char *name)
time(&ast_lastreloadtime);
ast_mutex_lock(&modlock);
+ oldversion = modlistver;
m = module_list;
while(m) {
if (!name || !strcasecmp(name, m->resource)) {
if (reloaded < 1)
reloaded = 1;
- if (m->reload) {
+ reload = m->reload;
+ ast_mutex_unlock(&modlock);
+ if (reload) {
reloaded = 2;
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Reloading module '%s' (%s)\n", m->resource, m->description());
- m->reload();
+ reload();
}
+ ast_mutex_lock(&modlock);
+ if (oldversion != modlistver)
+ break;
}
m = m->next;
}
@@ -380,6 +390,7 @@ int ast_load_resource(char *resource_name)
i->next = m;
}
+ modlistver = rand();
ast_mutex_unlock(&modlock);
if ((res = m->load_module())) {
ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, res);