[commit] r10306 - in freeswitch/trunk/src: . include mod/asr_tts/mod_cepstral mod/languages/mod_lua
Author: mikej Date: Sat Nov 8 06:21:54 2008 New Revision: 10306 Log: (LBAPR-1) load mod_lua with global symbols space so that sub modules are able to link to it properly. Broken in svn r9605. Modified: freeswitch/trunk/src/include/switch_types.h freeswitch/trunk/src/mod/asr_tts/mod_cepstral/mod_cepstral.c freeswitch/trunk/src/mod/languages/mod_lua/mod_lua.cpp freeswitch/trunk/src/switch_loadable_module.c Modified: freeswitch/trunk/src/include/switch_types.h ============================================================================== --- freeswitch/trunk/src/include/switch_types.h (original) +++ freeswitch/trunk/src/include/switch_types.h Sat Nov 8 06:21:54 2008 @@ -1355,7 +1355,7 @@ typedef struct switch_network_list switch_network_list_t; -#define SWITCH_API_VERSION 1 +#define SWITCH_API_VERSION 2 #define SWITCH_MODULE_LOAD_ARGS (switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool) #define SWITCH_MODULE_RUNTIME_ARGS (void) #define SWITCH_MODULE_SHUTDOWN_ARGS (void) @@ -1366,22 +1366,32 @@ #define SWITCH_MODULE_RUNTIME_FUNCTION(name) switch_status_t name SWITCH_MODULE_RUNTIME_ARGS #define SWITCH_MODULE_SHUTDOWN_FUNCTION(name) switch_status_t name SWITCH_MODULE_SHUTDOWN_ARGS +typedef enum { + SMODF_NONE = 0, + SMODF_GLOBAL_SYMBOLS = (1 << 0) +} switch_module_flag_enum_t; +typedef uint32_t switch_module_flag_t; + typedef struct switch_loadable_module_function_table { int switch_api_version; switch_module_load_t load; switch_module_shutdown_t shutdown; switch_module_runtime_t runtime; + switch_module_flag_t flags; } switch_loadable_module_function_table_t; -#define SWITCH_MODULE_DEFINITION(name, load, shutdown, runtime) \ +#define SWITCH_MODULE_DEFINITION_EX(name, load, shutdown, runtime, flags) \ static const char modname[] = #name ; \ SWITCH_MOD_DECLARE_DATA switch_loadable_module_function_table_t name##_module_interface = { \ SWITCH_API_VERSION, \ load, \ shutdown, \ - runtime \ + runtime, \ + flags \ } +#define SWITCH_MODULE_DEFINITION(name, load, shutdown, runtime) \ + SWITCH_MODULE_DEFINITION_EX(name, load, shutdown, runtime, SMODF_NONE) /* things we don't deserve to know about */ /*! \brief A channel */ Modified: freeswitch/trunk/src/mod/asr_tts/mod_cepstral/mod_cepstral.c ============================================================================== --- freeswitch/trunk/src/mod/asr_tts/mod_cepstral/mod_cepstral.c (original) +++ freeswitch/trunk/src/mod/asr_tts/mod_cepstral/mod_cepstral.c Sat Nov 8 06:21:54 2008 @@ -52,7 +52,7 @@ #define SWIFT_FAILED(r) ((void *)(r) < (void *)0) SWITCH_MODULE_LOAD_FUNCTION(mod_cepstral_load); -SWITCH_MODULE_DEFINITION(mod_cepstral, mod_cepstral_load, NULL, NULL); +SWITCH_MODULE_DEFINITION_EX(mod_cepstral, mod_cepstral_load, NULL, NULL, SMODF_GLOBAL_SYMBOLS); static swift_engine *engine; Modified: freeswitch/trunk/src/mod/languages/mod_lua/mod_lua.cpp ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_lua/mod_lua.cpp (original) +++ freeswitch/trunk/src/mod/languages/mod_lua/mod_lua.cpp Sat Nov 8 06:21:54 2008 @@ -40,8 +40,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_lua_load); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_lua_shutdown); -SWITCH_MODULE_DEFINITION(mod_lua, mod_lua_load, mod_lua_shutdown, NULL); - +SWITCH_MODULE_DEFINITION_EX(mod_lua, mod_lua_load, mod_lua_shutdown, NULL, SMODF_GLOBAL_SYMBOLS); static struct { switch_memory_pool_t *pool; char *xml_handler; Modified: freeswitch/trunk/src/switch_loadable_module.c ============================================================================== --- freeswitch/trunk/src/switch_loadable_module.c (original) +++ freeswitch/trunk/src/switch_loadable_module.c Sat Nov 8 06:21:54 2008 @@ -691,6 +691,7 @@ char *derr = NULL; const char *err = NULL; switch_memory_pool_t *pool; + switch_bool_t load_global = global; switch_assert(path != NULL); @@ -700,11 +701,11 @@ struct_name = switch_core_sprintf(pool, "%s_module_interface", filename); #ifdef WIN32 - dso = switch_dso_open("FreeSwitch.dll", global, &derr); + dso = switch_dso_open("FreeSwitch.dll", load_global, &derr); #elif defined (MACOSX) || defined(DARWIN) - dso = switch_dso_open(SWITCH_PREFIX_DIR "/lib/libfreeswitch.dylib", global, &derr); + dso = switch_dso_open(SWITCH_PREFIX_DIR "/lib/libfreeswitch.dylib", load_global, &derr); #else - dso = switch_dso_open(NULL, global, &derr); + dso = switch_dso_open(NULL, load_global, &derr); #endif if (!derr && dso) { interface_struct_handle = switch_dso_data_sym(dso, struct_name, &derr); @@ -713,7 +714,7 @@ switch_safe_free(derr) if (!interface_struct_handle) { - dso = switch_dso_open(path, global, &derr); + dso = switch_dso_open(path, load_global, &derr); } while (loading) { @@ -731,6 +732,20 @@ break; } + if (interface_struct_handle && interface_struct_handle->switch_api_version != SWITCH_API_VERSION) { + err = "Trying to load an out of date module, please rebuild the module."; + break; + } + + if (!load_global && interface_struct_handle && switch_test_flag(interface_struct_handle, SMODF_GLOBAL_SYMBOLS)) { + load_global = SWITCH_TRUE; + switch_dso_destroy(&dso); + interface_struct_handle = NULL; + dso = switch_dso_open(path, load_global, &derr); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Loading module with global namespace at request of module\n"); + continue; + } + if (interface_struct_handle) { mod_interface_functions = interface_struct_handle; load_func_ptr = mod_interface_functions->load;
participants (1)
-
FreeSWITCH SVN