[Freeswitch-svn] [commit] r9570 - freeswitch/trunk/src/mod/languages/mod_mono
Freeswitch SVN
mikej at freeswitch.org
Mon Sep 15 16:30:58 EDT 2008
Author: mikej
Date: Mon Sep 15 16:30:57 2008
New Revision: 9570
Modified:
freeswitch/trunk/src/mod/languages/mod_mono/mod_mono.cpp
Log:
cleanup
Modified: freeswitch/trunk/src/mod/languages/mod_mono/mod_mono.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_mono/mod_mono.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_mono/mod_mono.cpp Mon Sep 15 16:30:57 2008
@@ -34,7 +34,6 @@
#include <switch.h>
-
SWITCH_BEGIN_EXTERN_C
#include "freeswitch_mono.h"
@@ -50,27 +49,19 @@
#define EXPORT __declspec(dllexport)
#elif
#define EXPORT
-#endif /*
- */
-
+#endif
+
#define MOD_MONO_MANAGED_DLL "mod_mono_managed.dll"
-mod_mono_globals globals = {
-0};
-
-
+mod_mono_globals globals =
+{ 0 };
SWITCH_MODULE_LOAD_FUNCTION(mod_mono_load);
-
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mono_shutdown);
-
SWITCH_MODULE_DEFINITION(mod_mono, mod_mono_load, mod_mono_shutdown, NULL);
-
SWITCH_STANDARD_API(monorun_api_function); /* ExecuteBackground */
-
SWITCH_STANDARD_API(mono_api_function); /* Execute */
-
SWITCH_STANDARD_APP(mono_app_function); /* Run */
@@ -88,451 +79,292 @@
session->hangupDelegateHandle = mono_gchandle_new(hangupDelegate, FALSE);
}
-
switch_status_t setMonoDirs()
{
-
#ifdef WIN32
- /* Win32 Mono installs can't figure out their own path
- // Guys in #mono say we should just deploy all the libs we need
- // I think it's much nicer to let the user deal with installing Mono
- // and we'll just look for it in program files. */
- HANDLE hFind;
-
-WIN32_FIND_DATA findData;
-
-char progFilesPath[MAX_PATH];
-
-char findPath[MAX_PATH];
-
-SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, progFilesPath);
-
-switch_snprintf(findPath, MAX_PATH, "%s\\Mono-*", progFilesPath);
-
-hFind = FindFirstFile(findPath, &findData);
-
-if (hFind == INVALID_HANDLE_VALUE) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error looking for Mono in Program Files.\n");
-
-return SWITCH_STATUS_FALSE;
-
-}
-
-while ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {
-
-if (FindNextFile(hFind, &findData) == 0) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find Mono directory in Program Files.\n");
-
-FindClose(hFind);
-
-return SWITCH_STATUS_FALSE;
-
-}
-
-}
-
- /* Got it */
+ /* Win32 Mono installs can't figure out their own path
+ // Guys in #mono say we should just deploy all the libs we need
+ // I think it's much nicer to let the user deal with installing Mono
+ // and we'll just look for it in program files. */
+ HANDLE hFind;
+ WIN32_FIND_DATA findData;
+ char progFilesPath[MAX_PATH];
+ char findPath[MAX_PATH];
+
+ SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, progFilesPath);
+ switch_snprintf(findPath, MAX_PATH, "%s\\Mono-*", progFilesPath);
+ hFind = FindFirstFile(findPath, &findData);
+ if (hFind == INVALID_HANDLE_VALUE) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error looking for Mono in Program Files.\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ while ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {
+ if (FindNextFile(hFind, &findData) == 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find Mono directory in Program Files.\n");
+ FindClose(hFind);
+ return SWITCH_STATUS_FALSE;
+ }
+ }
+
+ /* Got it */
{
-
-char libPath[MAX_PATH];
-
-char etcPath[MAX_PATH];
-
-switch_snprintf(libPath, MAX_PATH, "%s\\%s\\lib", progFilesPath, findData.cFileName);
-
-switch_snprintf(etcPath, MAX_PATH, "%s\\%s\\etc", progFilesPath, findData.cFileName);
-
-FindClose(hFind);
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Using Mono paths '%s' and '%s'.\n", libPath, etcPath);
-
-mono_set_dirs(libPath, etcPath);
-
-return SWITCH_STATUS_SUCCESS;
-
-}
-
+ char libPath[MAX_PATH];
+ char etcPath[MAX_PATH];
+
+ switch_snprintf(libPath, MAX_PATH, "%s\\%s\\lib", progFilesPath, findData.cFileName);
+ switch_snprintf(etcPath, MAX_PATH, "%s\\%s\\etc", progFilesPath, findData.cFileName);
+ FindClose(hFind);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Using Mono paths '%s' and '%s'.\n", libPath, etcPath);
+ mono_set_dirs(libPath, etcPath);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
#elif
- // On other platforms, it should just work if it hasn't been relocated
- mono_set_dirs(NULL, NULL);
-
-return SWITCH_STATUS_SUCCESS;
-
+ // On other platforms, it should just work if it hasn't been relocated
+ mono_set_dirs(NULL, NULL);
+ return SWITCH_STATUS_SUCCESS;
+
#endif /*
- */
+ */
}
-
switch_status_t loadModMonoManaged()
{
-
- /* Find and load mod_mono_managed.exe */
+ /* Find and load mod_mono_managed.exe */
char filename[256];
-
-switch_snprintf(filename, 256, "%s%s%s", SWITCH_GLOBAL_dirs.mod_dir, SWITCH_PATH_SEPARATOR, MOD_MONO_MANAGED_DLL);
-
-globals.domain = mono_jit_init(filename);
-
-if (!globals.domain) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_jit_init failed.\n");
-
-return SWITCH_STATUS_FALSE;
-
-}
-
+ switch_snprintf(filename, 256, "%s%s%s", SWITCH_GLOBAL_dirs.mod_dir, SWITCH_PATH_SEPARATOR, MOD_MONO_MANAGED_DLL);
+ globals.domain = mono_jit_init(filename);
- /* Open the assembly */
- globals.mod_mono_asm = mono_domain_assembly_open(globals.domain, filename);
-
-if (!globals.mod_mono_asm) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_domain_assembly_open failed.\n");
-
-return SWITCH_STATUS_FALSE;
-
-}
-
-return SWITCH_STATUS_SUCCESS;
+ if (!globals.domain) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_jit_init failed.\n");
+ return SWITCH_STATUS_FALSE;
+ }
-}
+ /* Open the assembly */
+ globals.mod_mono_asm = mono_domain_assembly_open(globals.domain, filename);
+ if (!globals.mod_mono_asm) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mono_domain_assembly_open failed.\n");
+ return SWITCH_STATUS_FALSE;
+ }
+ return SWITCH_STATUS_SUCCESS;
+}
MonoMethod * getMethod(const char *name, MonoClass * klass)
{
-
-MonoMethodDesc * desc;
-
-MonoMethod * method;
-
-desc = mono_method_desc_new(name, TRUE);
-
-method = mono_method_desc_search_in_class(desc, klass);
-
-if (!method) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find %s method.\n", name);
-
-return NULL;
-
-}
-
-return method;
+ MonoMethodDesc * desc;
+ MonoMethod * method;
-}
+ desc = mono_method_desc_new(name, TRUE);
+ method = mono_method_desc_search_in_class(desc, klass);
+ if (!method) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find %s method.\n", name);
+ return NULL;
+ }
+
+ return method;
+}
switch_status_t findLoader()
{
-
- /* Find loader class and methods */
- MonoImage * img;
-
-MonoClass * loaderClass;
-
-img = mono_assembly_get_image(globals.mod_mono_asm);
-
-loaderClass = mono_class_from_name(img, "FreeSWITCH", "Loader");
-
-if (!loaderClass) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find FreeSWITCH.Loader class.\n");
-
-return SWITCH_STATUS_FALSE;
-
-}
-
+ /* Find loader class and methods */
+ MonoClass * loaderClass;
+ MonoImage * img = mono_assembly_get_image(globals.mod_mono_asm);
-globals.loadMethod = getMethod("FreeSWITCH.Loader:Load()", loaderClass);
-
-if (!globals.loadMethod)
+ if (!(loaderClass = mono_class_from_name(img, "FreeSWITCH", "Loader"))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find FreeSWITCH.Loader class.\n");
return SWITCH_STATUS_FALSE;
-
+ }
-globals.unloadMethod = getMethod("FreeSWITCH.Loader:Unload()", loaderClass);
-
-if (!globals.unloadMethod)
+ if (!(globals.loadMethod = getMethod("FreeSWITCH.Loader:Load()", loaderClass))) {
return SWITCH_STATUS_FALSE;
-
+ }
-globals.runMethod = getMethod("FreeSWITCH.Loader:Run(string,intptr)", loaderClass);
-
-if (!globals.runMethod)
+ if (!(globals.unloadMethod = getMethod("FreeSWITCH.Loader:Unload()", loaderClass))) {
return SWITCH_STATUS_FALSE;
-
+ }
-globals.executeMethod = getMethod("FreeSWITCH.Loader:Execute(string,intptr,intptr)", loaderClass);
-
-if (!globals.executeMethod)
+ if (!(globals.runMethod = getMethod("FreeSWITCH.Loader:Run(string,intptr)", loaderClass))) {
return SWITCH_STATUS_FALSE;
-
+ }
-globals.executeBackgroundMethod = getMethod("FreeSWITCH.Loader:ExecuteBackground(string)", loaderClass);
-
-if (!globals.executeBackgroundMethod)
+ if (!(globals.executeMethod = getMethod("FreeSWITCH.Loader:Execute(string,intptr,intptr)", loaderClass))) {
return SWITCH_STATUS_FALSE;
-
+ }
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found all loader functions.\n");
-
-return SWITCH_STATUS_SUCCESS;
+ if (!(globals.executeBackgroundMethod = getMethod("FreeSWITCH.Loader:ExecuteBackground(string)", loaderClass))) {
+ return SWITCH_STATUS_FALSE;
+ }
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found all loader functions.\n");
+ return SWITCH_STATUS_SUCCESS;
}
-
-
SWITCH_MODULE_LOAD_FUNCTION(mod_mono_load)
{
-
- /* connect my internal structure to the blank pointer passed to me */
- *module_interface = switch_loadable_module_create_module_interface(pool, modname);
-
-globals.pool = pool;
-
+ /* connect my internal structure to the blank pointer passed to me */
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);
-if (setMonoDirs() != SWITCH_STATUS_SUCCESS) {
-
-return SWITCH_STATUS_FALSE;
-
-}
-
-if (loadModMonoManaged() != SWITCH_STATUS_SUCCESS) {
-
-return SWITCH_STATUS_FALSE;
-
-}
-
-if (findLoader() != SWITCH_STATUS_SUCCESS) {
-
-return SWITCH_STATUS_FALSE;
-
-}
-
+ globals.pool = pool;
- /* Not sure if this is necesary on the loading thread */
- mono_thread_attach(globals.domain);
-
-mono_add_internal_call("FreeSWITCH.Native.MonoSession::InitMonoSession", InitMonoSession);
-
+ if (setMonoDirs() != SWITCH_STATUS_SUCCESS) {
+ return SWITCH_STATUS_FALSE;
+ }
- /* Run loader */
- MonoObject * objResult;
-
-MonoObject * exception = NULL;
-
-objResult = mono_runtime_invoke(globals.loadMethod, NULL, NULL, &exception);
-
-if (exception) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load threw an exception.\n");
-
-mono_print_unhandled_exception(exception);
-
-return SWITCH_STATUS_FALSE;
-
-}
-
-if (*(int *) mono_object_unbox(objResult)) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Load completed successfully.\n");
-
-} else {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load did not return true.\n");
-
-return SWITCH_STATUS_FALSE;
-
-}
-
+ if (loadModMonoManaged() != SWITCH_STATUS_SUCCESS) {
+ return SWITCH_STATUS_FALSE;
+ }
+ if (findLoader() != SWITCH_STATUS_SUCCESS) {
+ return SWITCH_STATUS_FALSE;
+ }
- /* We're good to register */
- switch_api_interface_t *api_interface;
-
-switch_application_interface_t *app_interface;
-
+ /* Not sure if this is necesary on the loading thread */
+ mono_thread_attach(globals.domain);
-SWITCH_ADD_API(api_interface, "monorun", "Run a module (ExecuteBackground)", monorun_api_function, "<module> [<args>]");
-
-SWITCH_ADD_API(api_interface, "mono", "Run a module as an API function (Execute)", mono_api_function, "<module> [<args>]");
-
-SWITCH_ADD_APP(app_interface, "mono", "Run Mono IVR", "Run a Mono IVR on a channel", mono_app_function, "<modulename> [<args>]", SAF_NONE);
-
+ mono_add_internal_call("FreeSWITCH.Native.MonoSession::InitMonoSession", InitMonoSession);
-return SWITCH_STATUS_SUCCESS;
+ /* Run loader */
+ MonoObject * objResult;
+ MonoObject * exception = NULL;
-}
+ objResult = mono_runtime_invoke(globals.loadMethod, NULL, NULL, &exception);
+
+ if (exception) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load threw an exception.\n");
+ mono_print_unhandled_exception(exception);
+ return SWITCH_STATUS_FALSE;
+ }
+
+ if (*(int *) mono_object_unbox(objResult)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Load completed successfully.\n");
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Load did not return true.\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ /* We're good to register */
+ switch_api_interface_t *api_interface;
+ switch_application_interface_t *app_interface;
+ SWITCH_ADD_API(api_interface, "monorun", "Run a module (ExecuteBackground)", monorun_api_function, "<module> [<args>]");
+ SWITCH_ADD_API(api_interface, "mono", "Run a module as an API function (Execute)", mono_api_function, "<module> [<args>]");
+ SWITCH_ADD_APP(app_interface, "mono", "Run Mono IVR", "Run a Mono IVR on a channel", mono_app_function, "<modulename> [<args>]", SAF_NONE);
+ return SWITCH_STATUS_SUCCESS;
+}
SWITCH_STANDARD_API(monorun_api_function)
{
-
- // TODO: Should we be detaching after all this?
- mono_thread_attach(globals.domain);
-
-if (switch_strlen_zero(cmd)) {
-
-stream->write_function(stream, "-ERR no args specified!\n");
-
-return SWITCH_STATUS_SUCCESS;
-
-}
-
+ // TODO: Should we be detaching after all this?
+ mono_thread_attach(globals.domain);
+
+ if (switch_strlen_zero(cmd)) {
+ stream->write_function(stream, "-ERR no args specified!\n");
+ return SWITCH_STATUS_SUCCESS;
+ }
- // ExecuteBackground(string command)
+ // ExecuteBackground(string command)
void *args[1];
-
-args[0] = mono_string_new(globals.domain, cmd);
-
-MonoObject * exception = NULL;
-
-MonoObject * objResult = mono_runtime_invoke(globals.executeBackgroundMethod, NULL, args, &exception);
-
-if (exception) {
-
-stream->write_function(stream, "-ERR FreeSWITCH.Loader.ExecuteBackground threw an exception.\n");
-
-mono_print_unhandled_exception(exception);
-
-return SWITCH_STATUS_SUCCESS;
-
-}
-
-if (*(int *) mono_object_unbox(objResult)) {
-
-stream->write_function(stream, "+OK\n");
-
-} else {
-
-stream->write_function(stream, "-ERR ExecuteBackground returned false (unknown module?).\n");
-
-}
-
-return SWITCH_STATUS_SUCCESS;
-}
+ args[0] = mono_string_new(globals.domain, cmd);
+ MonoObject * exception = NULL;
+ MonoObject * objResult = mono_runtime_invoke(globals.executeBackgroundMethod, NULL, args, &exception);
+
+ if (exception) {
+ stream->write_function(stream, "-ERR FreeSWITCH.Loader.ExecuteBackground threw an exception.\n");
+ mono_print_unhandled_exception(exception);
+ return SWITCH_STATUS_SUCCESS;
+ }
+ if (*(int *) mono_object_unbox(objResult)) {
+ stream->write_function(stream, "+OK\n");
+ } else {
+ stream->write_function(stream, "-ERR ExecuteBackground returned false (unknown module?).\n");
+ }
+ return SWITCH_STATUS_SUCCESS;
+}
SWITCH_STANDARD_API(mono_api_function)
{
-
-mono_thread_attach(globals.domain);
-
-if (switch_strlen_zero(cmd)) {
-
-stream->write_function(stream, "-ERR no args specified!\n");
-
-return SWITCH_STATUS_SUCCESS;
-
-}
-
+ mono_thread_attach(globals.domain);
- // Method is: Execute(string command, IntPtr streamPtr, IntPtr eventPtr)
+ if (switch_strlen_zero(cmd)) {
+ stream->write_function(stream, "-ERR no args specified!\n");
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ // Method is: Execute(string command, IntPtr streamPtr, IntPtr eventPtr)
void *args[3];
-
-args[0] = mono_string_new(globals.domain, cmd);
-
-args[1] = &stream; // Address of the arguments
+
+ args[0] = mono_string_new(globals.domain, cmd);
+ args[1] = &stream; // Address of the arguments
args[2] = &(stream->param_event);
-
-MonoObject * exception = NULL;
-
-MonoObject * objResult = mono_runtime_invoke(globals.executeMethod, NULL, args, &exception);
-
-if (exception) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute mono %s.\n", cmd);
-
-mono_print_unhandled_exception(exception);
-
-}
-
-if (!(*(int *) mono_object_unbox(objResult))) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Execute failed for %s (unknown module?).\n", cmd);
-
-}
-
-return SWITCH_STATUS_SUCCESS;
+ MonoObject * exception = NULL;
+ MonoObject * objResult = mono_runtime_invoke(globals.executeMethod, NULL, args, &exception);
-}
+ if (exception) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute mono %s.\n", cmd);
+ mono_print_unhandled_exception(exception);
+ }
+ if (!(*(int *) mono_object_unbox(objResult))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Execute failed for %s (unknown module?).\n", cmd);
+ }
+ return SWITCH_STATUS_SUCCESS;
+}
SWITCH_STANDARD_APP(mono_app_function)
{
-
-mono_thread_attach(globals.domain);
-
-if (switch_strlen_zero(data)) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No args specified!\n");
-
-}
-
+ mono_thread_attach(globals.domain);
+
+ if (switch_strlen_zero(data)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No args specified!\n");
+ }
- // bool Run(string command, IntPtr sessionHandle)
+ // bool Run(string command, IntPtr sessionHandle)
void *args[2];
-
-args[0] = mono_string_new(globals.domain, data);
-
-args[1] = &session;
-
-MonoObject * exception = NULL;
-
-MonoObject * objResult = mono_runtime_invoke(globals.runMethod, NULL, args, &exception);
-
-if (exception) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute application mono %s.\n", data);
-
-mono_print_unhandled_exception(exception);
-
-}
-
-if (!(*(int *) mono_object_unbox(objResult))) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Application run failed for %s (unknown module?).\n", data);
-
-}
+ args[0] = mono_string_new(globals.domain, data);
+ args[1] = &session;
+
+ MonoObject * exception = NULL;
+ MonoObject * objResult = mono_runtime_invoke(globals.runMethod, NULL, args, &exception);
+ if (exception) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception trying to execute application mono %s.\n", data);
+ mono_print_unhandled_exception(exception);
+ }
+
+ if (!(*(int *) mono_object_unbox(objResult))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Application run failed for %s (unknown module?).\n", data);
+ }
}
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mono_shutdown)
{
-
-mono_thread_attach(globals.domain);
-
-MonoObject * ex;
-
-mono_runtime_invoke(globals.unloadMethod, NULL, NULL, &ex);
-
-if (ex) {
-
-switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception occurred in Loader::Unload.\n");
-
-mono_print_unhandled_exception(ex);
-
-}
-
-mono_runtime_set_shutting_down();
-
-mono_runtime_cleanup(globals.domain);
-
-mono_runtime_quit();
-
-return SWITCH_STATUS_SUCCESS;
+ MonoObject * ex;
-}
+ mono_thread_attach(globals.domain);
+ mono_runtime_invoke(globals.unloadMethod, NULL, NULL, &ex);
+ if (ex) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception occurred in Loader::Unload.\n");
+ mono_print_unhandled_exception(ex);
+ }
+
+ mono_runtime_set_shutting_down();
+ mono_runtime_cleanup(globals.domain);
+ mono_runtime_quit();
+ return SWITCH_STATUS_SUCCESS;
+}
SWITCH_END_EXTERN_C
More information about the Freeswitch-svn
mailing list