diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-11-17 13:40:47 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-11-17 13:40:47 +0000 |
commit | 6b4b4c491eccbffde6432cafe08b09af6cecdf45 (patch) | |
tree | e9fc78de6436137f4d329c2ff742fb720c393e43 | |
parent | d6a6fed8b87cecdf5f139f9b4cd0de1fd2bc51a2 (diff) |
Don't hold modlock while doing reload
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4276 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | loader.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -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); |