From 1496da97fb0984fa7734d91607960aea83d173fa Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Sun, 16 Jan 2005 22:59:30 +0000 Subject: Optimize module loading (bug #3356) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4814 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- config.c | 4 ++-- include/asterisk/config.h | 4 ++-- include/asterisk/module.h | 4 ++-- loader.c | 38 ++++++++++++++++++++++++-------------- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/config.c b/config.c index d565d32a8..e27eb58b0 100755 --- a/config.c +++ b/config.c @@ -119,7 +119,7 @@ int ast_false(const char *s) return 0; } -struct ast_variable *ast_variable_browse(struct ast_config *config, char *category) +struct ast_variable *ast_variable_browse(const struct ast_config *config, const char *category) { struct ast_category *cat; cat = config->root; @@ -137,7 +137,7 @@ struct ast_variable *ast_variable_browse(struct ast_config *config, char *catego return NULL; } -char *ast_variable_retrieve(struct ast_config *config, char *category, char *value) +char *ast_variable_retrieve(const struct ast_config *config, const char *category, const char *value) { struct ast_variable *v; if (category) { diff --git a/include/asterisk/config.h b/include/asterisk/config.h index 4e7569c26..b8be39bf7 100755 --- a/include/asterisk/config.h +++ b/include/asterisk/config.h @@ -68,7 +68,7 @@ char *ast_category_browse(struct ast_config *config, char *prev); * List variables of config file * Returns ast_variable list on success, or NULL on failure */ -struct ast_variable *ast_variable_browse(struct ast_config *config, char *category); +struct ast_variable *ast_variable_browse(const struct ast_config *config, const char *category); /*! Gets a variable */ /*! @@ -78,7 +78,7 @@ struct ast_variable *ast_variable_browse(struct ast_config *config, char *catego * Goes through a given config file in the given category and searches for the given variable * Returns the variable value on success, or NULL if unable to find it. * Retrieve a specific variable */ -char *ast_variable_retrieve(struct ast_config *config, char *category, char *value); +char *ast_variable_retrieve(const struct ast_config *config, const char *category, const char *value); /*! Make sure something is true */ /*! diff --git a/include/asterisk/module.h b/include/asterisk/module.h index 41cb6f39a..f1cc115f1 100755 --- a/include/asterisk/module.h +++ b/include/asterisk/module.h @@ -89,7 +89,7 @@ this paragraph under other terms as well." * it will do the rest. * It returns 0 on success, -1 on error */ -int ast_load_resource(char *resource_name); +int ast_load_resource(const char *resource_name); /*! Unloads a module */ /*! @@ -99,7 +99,7 @@ int ast_load_resource(char *resource_name); * it will not unload a module with a usecount > 0. However, if it is set, * it will unload the module regardless of consequences (NOT_RECOMMENDED) */ -int ast_unload_resource(char *resource_name, int force); +int ast_unload_resource(const char *resource_name, int force); /*! Notify when usecount has been changed */ /*! diff --git a/loader.c b/loader.c index 89d006ea3..b6c0711fe 100755 --- a/loader.c +++ b/loader.c @@ -105,7 +105,7 @@ AST_MUTEX_DEFINE_STATIC(reloadlock); static struct module *module_list=NULL; static int modlistver = 0; -int ast_unload_resource(char *resource_name, int force) +int ast_unload_resource(const char *resource_name, int force) { struct module *m, *ml = NULL; int res = -1; @@ -244,7 +244,7 @@ int ast_module_reload(const char *name) return reloaded; } -int ast_load_resource(char *resource_name) +static int __load_resource(const char *resource_name, const struct ast_config *cfg) { static char fn[256]; int errors=0; @@ -255,23 +255,16 @@ int ast_load_resource(char *resource_name) char *val; #endif char *key; - int o; - struct ast_config *cfg; char tmp[80]; - /* Keep the module file parsing silent */ - o = option_verbose; + if (strncasecmp(resource_name, "res_", 4)) { - option_verbose = 0; - cfg = ast_load(AST_MODULE_CONFIG); - option_verbose = o; - if (cfg) { #ifdef RTLD_GLOBAL + if (cfg) { if ((val = ast_variable_retrieve(cfg, "global", resource_name)) && ast_true(val)) flags |= RTLD_GLOBAL; -#endif - ast_destroy(cfg); } +#endif } else { /* Resource modules are always loaded global and lazy */ #ifdef RTLD_GLOBAL @@ -399,6 +392,23 @@ int ast_load_resource(char *resource_name) } ast_update_use_count(); return 0; +} + +int ast_load_resource(const char *resource_name) +{ + int o; + struct ast_config *cfg = NULL; + int res; + + /* Keep the module file parsing silent */ + o = option_verbose; + option_verbose = 0; + cfg = ast_load(AST_MODULE_CONFIG); + option_verbose = o; + res = __load_resource(resource_name, cfg); + if (cfg) + ast_destroy(cfg); + return res; } static int ast_resource_exists(char *resource) @@ -446,7 +456,7 @@ int load_modules() ast_verbose( VERBOSE_PREFIX_1 "[%s]", term_color(tmp, v->value, COLOR_BRWHITE, 0, sizeof(tmp))); fflush(stdout); } - if (ast_load_resource(v->value)) { + if (__load_resource(v->value, cfg)) { ast_log(LOG_WARNING, "Loading module %s failed!\n", v->value); if (cfg) ast_destroy(cfg); @@ -496,7 +506,7 @@ int load_modules() ast_verbose( VERBOSE_PREFIX_1 "[%s]", term_color(tmp, d->d_name, COLOR_BRWHITE, 0, sizeof(tmp))); fflush(stdout); } - if (ast_load_resource(d->d_name)) { + if (__load_resource(d->d_name, cfg)) { ast_log(LOG_WARNING, "Loading module %s failed!\n", d->d_name); if (cfg) ast_destroy(cfg); -- cgit v1.2.3