attempting to load running modules
authorDavid Vossel <dvossel@digium.com>
Mon, 22 Jun 2009 15:33:35 +0000 (15:33 +0000)
committerDavid Vossel <dvossel@digium.com>
Mon, 22 Jun 2009 15:33:35 +0000 (15:33 +0000)
Modules placed in the priority heap for loading were not properly removed from the linked list.  This resulted in some modules attempting to load twice.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@202410 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/module.h
main/loader.c

index e7aec44..48911c8 100644 (file)
@@ -58,10 +58,11 @@ enum ast_module_unload_mode {
 };
 
 enum ast_module_load_result {
-       AST_MODULE_LOAD_SUCCESS = 0,    /*!< Module loaded and configured */
-       AST_MODULE_LOAD_DECLINE = 1,    /*!< Module is not configured */
-       AST_MODULE_LOAD_SKIP = 2,       /*!< Module was skipped for some reason */
-       AST_MODULE_LOAD_FAILURE = -1,   /*!< Module could not be loaded properly */
+       AST_MODULE_LOAD_SUCCESS = 0,    /*!< Module loaded and configured */
+       AST_MODULE_LOAD_DECLINE = 1,    /*!< Module is not configured */
+       AST_MODULE_LOAD_SKIP = 2,       /*!< Module was skipped for some reason */
+       AST_MODULE_LOAD_PRIORITY = 3,   /*!< Module is not loaded yet, but is added to prioity heap */
+       AST_MODULE_LOAD_FAILURE = -1,   /*!< Module could not be loaded properly */
 };
 
 /*! 
index 45b6661..a8e9864 100644 (file)
@@ -742,9 +742,8 @@ static enum ast_module_load_result start_resource(struct ast_module *mod)
                mod->flags.declined = 1;
                break;
        case AST_MODULE_LOAD_FAILURE:
-               break;
-       case AST_MODULE_LOAD_SKIP:
-               /* modules should never return this value */
+       case AST_MODULE_LOAD_SKIP: /* modules should never return this value */
+       case AST_MODULE_LOAD_PRIORITY:
                break;
        }
 
@@ -806,7 +805,7 @@ static enum ast_module_load_result load_resource(const char *resource_name, unsi
 
        if (resource_heap) {
                ast_heap_push(resource_heap, mod);
-               res = AST_MODULE_LOAD_SKIP;
+               res = AST_MODULE_LOAD_PRIORITY;
        } else {
                res = start_resource(mod);
        }
@@ -892,6 +891,9 @@ static int load_resource_list(struct load_order *load_order, unsigned int global
                        goto done;
                case AST_MODULE_LOAD_SKIP:
                        break;
+               case AST_MODULE_LOAD_PRIORITY:
+                       AST_LIST_REMOVE_CURRENT(entry);
+                       break;
                }
        }
        AST_LIST_TRAVERSE_SAFE_END;
@@ -907,6 +909,7 @@ static int load_resource_list(struct load_order *load_order, unsigned int global
                        res = -1;
                        goto done;
                case AST_MODULE_LOAD_SKIP:
+               case AST_MODULE_LOAD_PRIORITY:
                        break;
                }
        }