From 9274deeabbc2f976772cf48a1cd41dc82c430572 Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Tue, 26 Oct 2010 06:06:05 -0500 Subject: [PATCH] skypopen: fixed crash on closing XDisplay before is used by interface shutdown/remove --- src/mod/endpoints/mod_skypopen/mod_skypopen.c | 16 ++++++++++++++++ .../endpoints/mod_skypopen/skypopen_protocol.c | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_skypopen/mod_skypopen.c b/src/mod/endpoints/mod_skypopen/mod_skypopen.c index 38d47eb50d..bd9f10cf17 100644 --- a/src/mod/endpoints/mod_skypopen/mod_skypopen.c +++ b/src/mod/endpoints/mod_skypopen/mod_skypopen.c @@ -397,6 +397,12 @@ static switch_status_t interface_exists(char *the_interface) switch_yield(50000); } + if (tech_pvt->SkypopenHandles.disp) { + NOTICA("REMOVE CLOSIN X\n", SKYPOPEN_P_LOG); + XCloseDisplay(tech_pvt->SkypopenHandles.disp); + NOTICA("REMOVE CLOSIN X END\n", SKYPOPEN_P_LOG); + } + if (globals.SKYPOPEN_INTERFACES[interface_id].skypopen_signaling_thread) { switch_thread_join(&status, globals.SKYPOPEN_INTERFACES[interface_id].skypopen_signaling_thread); } @@ -1993,6 +1999,11 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_skypopen_shutdown) x--; switch_yield(50000); } + if (tech_pvt->SkypopenHandles.disp) { + NOTICA("CLOSIN X\n", SKYPOPEN_P_LOG); + XCloseDisplay(tech_pvt->SkypopenHandles.disp); + NOTICA("CLOSIN X END\n", SKYPOPEN_P_LOG); + } if (globals.SKYPOPEN_INTERFACES[interface_id].skypopen_signaling_thread) { switch_thread_join(&status, globals.SKYPOPEN_INTERFACES[interface_id].skypopen_signaling_thread); } @@ -3106,11 +3117,15 @@ struct SkypopenHandles *skypopen_list_remove_by_value(struct SkypopenList *list, // CLOUDTREE (THomas Hazel) - is there a capable freeswitch list? struct SkypopenHandles *skypopen_list_remove_by_reference(struct SkypopenList *list, struct SkypopenHandles *handle) { + private_t *tech_pvt=NULL; + switch_mutex_lock(globals.list_mutex); + NOTICA("BEGIN REMOVE\n", SKYPOPEN_P_LOG); if (handle->managed == SWITCH_FALSE) { // already removed switch_mutex_unlock(globals.list_mutex); + NOTICA("EXIT REMOVE\n", SKYPOPEN_P_LOG); return 0; } @@ -3135,6 +3150,7 @@ struct SkypopenHandles *skypopen_list_remove_by_reference(struct SkypopenList *l list->entries--; switch_mutex_unlock(globals.list_mutex); + NOTICA("EXIT REMOVE\n", SKYPOPEN_P_LOG); return handle; } diff --git a/src/mod/endpoints/mod_skypopen/skypopen_protocol.c b/src/mod/endpoints/mod_skypopen/skypopen_protocol.c index 0dc34b7d65..2ea46dc356 100644 --- a/src/mod/endpoints/mod_skypopen/skypopen_protocol.c +++ b/src/mod/endpoints/mod_skypopen/skypopen_protocol.c @@ -1883,7 +1883,7 @@ void *skypopen_do_skypeapi_thread_func(void *obj) #endif tech_pvt->skypopen_api_thread = NULL; - XCloseDisplay(disp); + //XCloseDisplay(disp); return NULL; }