Author: gmaruzz Date: Tue Dec 9 14:41:22 2008 New Revision: 10684 Log: switch_apr.c: added switch_thread_exit skypiax: less trying to unload without crashes on windows, not yet there Modified: freeswitch/branches/gmaruzz/src/include/switch_apr.h freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax_protocol.c freeswitch/branches/gmaruzz/src/switch_apr.c Modified: freeswitch/branches/gmaruzz/src/include/switch_apr.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_apr.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_apr.h Tue Dec 9 14:41:22 2008 @@ -1321,6 +1321,13 @@ SWITCH_DECLARE(switch_status_t) switch_file_pipe_timeout_set(switch_file_t *thepipe, switch_interval_time_t timeout); +/** + * stop the current thread + * @param thd The thread to stop + * @param retval The return value to pass back to any thread that cares + */ +SWITCH_DECLARE(switch_status_t) switch_thread_exit(switch_thread_t *thd, switch_status_t retval); + /** @} */ Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c Tue Dec 9 14:41:22 2008 @@ -32,6 +32,9 @@ int running = 1; skypiax_interface_t SKYPIAX_INTERFACES[SKYPIAX_MAX_INTERFACES]; switch_core_session_t *global_session = NULL; +#ifdef WIN32 +HANDLE win32_hGlobal_ThreadShutdownEvent; +#endif /* WIN32 */ /*************************************************/ /*************************************************/ /*************************************************/ @@ -875,11 +878,15 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_skypiax_shutdown) { - int x = 100; + int x = 1000; struct skypiax_interface *p = NULL; running = 0; +#ifdef WIN32 + SetEvent(win32_hGlobal_ThreadShutdownEvent); +#endif + while (x) { x--; switch_yield(20000); Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax_protocol.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax_protocol.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax_protocol.c Tue Dec 9 14:41:22 2008 @@ -6,6 +6,9 @@ extern switch_endpoint_interface_t *skypiax_endpoint_interface; extern int running; extern skypiax_interface_t SKYPIAX_INTERFACES; +#ifdef WIN32 +extern HANDLE win32_hGlobal_ThreadShutdownEvent; +#endif /* WIN32 */ #define SKYPE_AUDIO #ifdef SKYPE_AUDIO @@ -379,7 +382,6 @@ HWND win32_hInit_MainWindowHandle; HINSTANCE win32_hInit_ProcessHandle; char win32_acInit_WindowClassName[128]; -HANDLE win32_hGlobal_ThreadShutdownEvent; UINT win32_uiGlobal_MsgID_SkypeControlAPIAttach; UINT win32_uiGlobal_MsgID_SkypeControlAPIDiscover; HWND win32_hGlobal_SkypeAPIWindowHandle = NULL; @@ -573,6 +575,7 @@ /* destroy window class */ struct skypiax_interface *p; + DWORD MsgWaitResult; p = obj; switch_file_pipe_create_ex(&p->AsteriskHandlesAst.fdesc[0], @@ -590,25 +593,35 @@ && win32_uiGlobal_MsgID_SkypeControlAPIDiscover != 0) { if (win32_Initialize_CreateWindowClass()) { if (win32_Initialize_CreateMainWindow()) { - win32_hGlobal_ThreadShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + //win32_hGlobal_ThreadShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + win32_hGlobal_ThreadShutdownEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (win32_hGlobal_ThreadShutdownEvent != NULL) { if (SendMessage (HWND_BROADCAST, win32_uiGlobal_MsgID_SkypeControlAPIDiscover, (WPARAM) win32_hInit_MainWindowHandle, 0) != 0) { win32_AsteriskHandlesSkype->win32_hInit_MainWindowHandle = win32_hInit_MainWindowHandle; - while (1) { - MSG oMessage; - if(!running) - break; - - while (GetMessage(&oMessage, 0, 0, 0) != FALSE) { - if(!running) - break; - TranslateMessage(&oMessage); - DispatchMessage(&oMessage); - } - } + while (1) { + MSG oMessage; + const HANDLE *MsgWaitHandles[1]; + + MsgWaitHandles[0] = &win32_hGlobal_ThreadShutdownEvent; + if(!running) + break; + while (MsgWaitResult = MsgWaitForMultipleObjects(1,MsgWaitHandles, FALSE, 300,QS_ALLPOSTMESSAGE)){ + if(!running) + break; + if (MsgWaitResult == WAIT_TIMEOUT) { + continue; + } + + GetMessage(&oMessage, 0, 0, 0); + if(!running) + break; + TranslateMessage(&oMessage); + DispatchMessage(&oMessage); + } + } } CloseHandle(win32_hGlobal_ThreadShutdownEvent); } @@ -617,6 +630,10 @@ win32_DeInitialize_DestroyWindowClass(); } } + + + switch_thread_exit(thread, SWITCH_STATUS_SUCCESS); + return NULL; } Modified: freeswitch/branches/gmaruzz/src/switch_apr.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_apr.c (original) +++ freeswitch/branches/gmaruzz/src/switch_apr.c Tue Dec 9 14:41:22 2008 @@ -970,6 +970,17 @@ } +/** + * stop the current thread + * @param thd The thread to stop + * @param retval The return value to pass back to any thread that cares + */ +SWITCH_DECLARE(switch_status_t) switch_thread_exit(switch_thread_t *thd, switch_status_t retval) +{ + return apr_thread_exit((apr_thread_t *)thd, retval); +} + + /* For Emacs: * Local Variables: * mode:c