Version 0.1.8 from FTP
[asterisk/asterisk.git] / loader.c
index b216a07..8293993 100755 (executable)
--- a/loader.c
+++ b/loader.c
@@ -20,6 +20,7 @@
 #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
@@ -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;
 }