diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index b7db7985c6..39b71f1f88 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1388,6 +1388,9 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi if (msg->message_id == SWITCH_MESSAGE_INDICATE_SIGNAL_DATA) { sofia_dispatch_event_t *de = (sofia_dispatch_event_t *) msg->pointer_arg; switch_mutex_lock(tech_pvt->sofia_mutex); + if (switch_core_session_in_thread(session)) { + de->session = session; + } sofia_process_dispatch_event(&de); switch_mutex_unlock(tech_pvt->sofia_mutex); goto end; diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index c20a45e6e4..07c917cbca 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -143,6 +143,7 @@ typedef struct sofia_dispatch_event_s { nua_t *nua; sofia_profile_t *profile; int save; + switch_core_session_t *session; } sofia_dispatch_event_t; struct sofia_private { diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 865feebbde..464f5ff50d 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -818,14 +818,14 @@ static void our_sofia_event_callback(nua_event_t event, return; } } else if (!zstr(sofia_private->uuid)) { - if ((session = switch_core_session_locate(sofia_private->uuid))) { + if ((session = de->session) || (session = switch_core_session_locate(sofia_private->uuid))) { tech_pvt = switch_core_session_get_private(session); channel = switch_core_session_get_channel(session); if (tech_pvt) { switch_mutex_lock(tech_pvt->sofia_mutex); locked = 1; } else { - switch_core_session_rwunlock(session); + if (session != de->session) switch_core_session_rwunlock(session); return; } @@ -1111,7 +1111,7 @@ static void our_sofia_event_callback(nua_event_t event, switch_mutex_unlock(tech_pvt->sofia_mutex); } - if (session) { + if (session && session != de->session) { switch_core_session_rwunlock(session); } }