From d4f6fb8e8c1106ffe66c1c9d651fa5382f19abe0 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sat, 17 Mar 2007 19:51:08 +0000 Subject: [PATCH] update git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4632 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch.h | 2 +- src/include/switch_loadable_module.h | 2 +- src/include/switch_types.h | 5 ++ .../applications/mod_commands/mod_commands.c | 7 ++- src/switch_loadable_module.c | 59 +++++++++++++------ 5 files changed, 53 insertions(+), 22 deletions(-) diff --git a/src/include/switch.h b/src/include/switch.h index 2d8936fdf2..201e5c815b 100644 --- a/src/include/switch.h +++ b/src/include/switch.h @@ -48,7 +48,7 @@ #endif #define FREESWITCH_PEN "27880" -#define FREESWITCH_MIB ".1.3.6.1.4.1." FREESWITCH_PEN +#define FREESWITCH_OID_PREFIX ".1.3.6.1.4.1." FREESWITCH_PEN #define FREESWITCH_ITAD "543" diff --git a/src/include/switch_loadable_module.h b/src/include/switch_loadable_module.h index e66b35c65a..2766136224 100644 --- a/src/include/switch_loadable_module.h +++ b/src/include/switch_loadable_module.h @@ -240,7 +240,7 @@ SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, switch_ \param fname the file name of the module \return the status */ -SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname); +SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname, switch_bool_t runtime); /* Prototypes of module interface functions */ diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 14fecdd7b9..f0fc506b76 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -128,6 +128,11 @@ SWITCH_BEGIN_EXTERN_C #define SWITCH_BITS_PER_BYTE 8 typedef uint8_t switch_byte_t; +typedef enum { + SWITCH_FALSE = 0, + SWITCH_TRUE = 1 +} switch_bool_t; + typedef enum { SSM_NA, SSM_PRONOUNCED, diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index c37b1775c1..5e47fa2c85 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -158,8 +158,11 @@ static switch_status_t load_function(char *mod, switch_core_session_t *session, return SWITCH_STATUS_SUCCESS; } - switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) mod); - stream->write_function(stream, "OK\n"); + if (switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) mod, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { + stream->write_function(stream, "OK\n"); + } else { + stream->write_function(stream, "ERROR\n"); + } return SWITCH_STATUS_SUCCESS; } diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index e374ac56d2..14339402d7 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -96,8 +96,22 @@ static void *switch_loadable_module_exec(switch_thread_t *thread, void *obj) } +static void switch_loadable_module_runtime(void) +{ + switch_hash_index_t *hi; + void *val; + switch_loadable_module_t *module; - + for (hi = switch_hash_first(loadable_modules.pool, loadable_modules.module_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, NULL, NULL, &val); + module = (switch_loadable_module_t *) val; + + if (module->switch_module_runtime) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Starting runtime thread for %s\n", module->module_interface->module_name); + switch_core_launch_thread(switch_loadable_module_exec, module, loadable_modules.pool); + } + } +} static switch_status_t switch_loadable_module_process(char *key, switch_loadable_module_t *new_module) { @@ -349,13 +363,20 @@ static switch_status_t switch_loadable_module_process(char *key, switch_loadable if (!ptr->relative_oid) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to load management interface from %s due to no interface name.\n", key); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Adding Management interface '%s'\n", ptr->relative_oid); - if (switch_event_create(&event, SWITCH_EVENT_MODULE_LOAD) == SWITCH_STATUS_SUCCESS) { - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "type", "management"); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "name", "%s", ptr->relative_oid); - switch_event_fire(&event); + if (switch_core_hash_find(loadable_modules.management_hash, ptr->relative_oid)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Failed to load management interface %s. OID %s already exists\n", key, ptr->relative_oid); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, + "Adding Management interface '%s' OID[%s.%s]\n", key, FREESWITCH_OID_PREFIX, ptr->relative_oid); + switch_core_hash_insert(loadable_modules.management_hash, ptr->relative_oid, (const void *) ptr); + if (switch_event_create(&event, SWITCH_EVENT_MODULE_LOAD) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "type", "management"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "name", "%s", ptr->relative_oid); + switch_event_fire(&event); + } } - switch_core_hash_insert(loadable_modules.management_hash, ptr->relative_oid, (const void *) ptr); + } } } @@ -429,10 +450,6 @@ static switch_status_t switch_loadable_module_load_file(char *filename, switch_l module->lib = dso; - if (module->switch_module_runtime) { - switch_core_launch_thread(switch_loadable_module_exec, module, loadable_modules.pool); - } - *new_module = module; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Successfully Loaded [%s]\n", module_interface->module_name); @@ -440,7 +457,7 @@ static switch_status_t switch_loadable_module_load_file(char *filename, switch_l } -SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname) +SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname, switch_bool_t runtime) { switch_size_t len = 0; char *path; @@ -485,10 +502,15 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, ch } if ((status = switch_loadable_module_load_file(path, &new_module) == SWITCH_STATUS_SUCCESS)) { - return switch_loadable_module_process((char *) file, new_module); - } else { - return status; + if ((status = switch_loadable_module_process((char *) file, new_module)) == SWITCH_STATUS_SUCCESS && runtime) { + if (new_module->switch_module_runtime) { + switch_core_launch_thread(switch_loadable_module_exec, new_module, loadable_modules.pool); + } + } } + + return status; + } SWITCH_DECLARE(switch_status_t) switch_loadable_module_build_dynamic(char *filename, @@ -625,7 +647,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init() switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid extension for %s\n", val); continue; } - switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) val); + switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) val, SWITCH_FALSE); count++; } } @@ -645,7 +667,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init() switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Invalid extension for %s\n", val); continue; } - switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) val); + switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) val, SWITCH_FALSE); count++; } } @@ -685,11 +707,12 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init() continue; } - switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) fname); + switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) fname, SWITCH_FALSE); } apr_dir_close(module_dir_handle); } + switch_loadable_module_runtime(); return SWITCH_STATUS_SUCCESS; }