]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Don't hold modlock while doing reload
authorRussell Bryant <russell@russellbryant.com>
Tue, 7 Dec 2004 02:16:49 +0000 (02:16 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 7 Dec 2004 02:16:49 +0000 (02:16 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/v1-0@4395 65c4cc65-6c06-0410-ace0-fbb531ad65f3

loader.c

index 2a539f30c538cd1f0399585ea6d647dbf0dc82d1..5879306c9d827c81ebe6180f547c7ba0a3ff190b 100755 (executable)
--- 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;
@@ -150,6 +152,8 @@ int ast_unload_resource(char *resource_name, int force)
 void ast_module_reload(const char *name)
 {
        struct module *m;
+       int oldversion;
+       int (*reload)(void);
 
        /* We'll do the logger and manager the favor of calling its reload here first */
 
@@ -168,14 +172,20 @@ void 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 (m->reload) {
+                       reload = m->reload;
+                       ast_mutex_unlock(&modlock);
+                       if (reload) {
                                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;
        }
@@ -328,7 +338,8 @@ 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);