diff --git a/src/include/private/switch_core_pvt.h b/src/include/private/switch_core_pvt.h index 6c0655525d..4852afaa4d 100644 --- a/src/include/private/switch_core_pvt.h +++ b/src/include/private/switch_core_pvt.h @@ -109,6 +109,7 @@ struct switch_core_session { switch_mutex_t *mutex; switch_mutex_t *resample_mutex; + switch_mutex_t *signal_mutex; switch_thread_cond_t *cond; switch_thread_rwlock_t *rwlock; diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 26d5220452..afa939a6d4 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -286,6 +286,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_destroy(void); ///\ingroup core1 ///\{ +SWITCH_DECLARE(switch_status_t) switch_core_session_signal_lock(switch_core_session_t *session); +SWITCH_DECLARE(switch_status_t) switch_core_session_signal_unlock(switch_core_session_t *session); + #ifdef SWITCH_DEBUG_RWLOCKS SWITCH_DECLARE(switch_status_t) switch_core_session_perform_read_lock(_In_ switch_core_session_t *session, const char *file, const char *func, int line); #endif diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index a147e3dd25..a502232bd2 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -2538,6 +2538,8 @@ static ldl_status handle_signalling(ldl_handle_t * handle, ldl_session_t * dlses if ((session = ldl_session_get_private(dlsession))) { + + switch_core_session_signal_lock(session); tech_pvt = switch_core_session_get_private(session); switch_assert(tech_pvt != NULL); @@ -2559,7 +2561,7 @@ static ldl_status handle_signalling(ldl_handle_t * handle, ldl_session_t * dlses } if ((session = switch_core_session_request(dingaling_endpoint_interface, NULL)) != 0) { switch_core_session_add_stream(session, NULL); - + switch_core_session_signal_lock(session); if ((tech_pvt = (struct private_object *) switch_core_session_alloc(session, sizeof(struct private_object))) != 0) { char *exten; @@ -2946,6 +2948,10 @@ static ldl_status handle_signalling(ldl_handle_t * handle, ldl_session_t * dlses done: + if (session) { + switch_core_session_signal_unlock(session); + } + return status; } diff --git a/src/mod/endpoints/mod_iax/mod_iax.c b/src/mod/endpoints/mod_iax/mod_iax.c index bebf9f822f..8c6e2b61d3 100644 --- a/src/mod/endpoints/mod_iax/mod_iax.c +++ b/src/mod/endpoints/mod_iax/mod_iax.c @@ -938,6 +938,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_iax_runtime) if ((tech_pvt = iax_get_private(iaxevent->session))) { channel = switch_core_session_get_channel(tech_pvt->session); + switch_core_session_signal_lock(tech_pvt->session); } if (globals.debug && iaxevent->etype != IAX_EVENT_VOICE) { @@ -1115,6 +1116,10 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_iax_runtime) break; } iax_event_free(iaxevent); + + if (tech_pvt && tech_pvt->session) { + switch_core_session_signal_unlock(tech_pvt->session); + } } } diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 5f5b09b744..54deab6855 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -708,7 +708,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi switch_status_t status = SWITCH_STATUS_SUCCESS; switch_mutex_lock(tech_pvt->flag_mutex); - + if (switch_channel_get_state(channel) >= CS_HANGUP || !tech_pvt) { status = SWITCH_STATUS_FALSE; goto end; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 1c2b121089..732f1ad5a6 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -222,8 +222,8 @@ void sofia_event_callback(nua_event_t event, nua_event_name(event), status, phrase, session ? switch_channel_get_name(channel) : "n/a"); } - if (tech_pvt) { - switch_mutex_lock(tech_pvt->flag_mutex); + if (session) { + switch_core_session_signal_lock(session); } if ((profile->pflags & PFLAG_AUTH_ALL) && tech_pvt && tech_pvt->key && sip) { @@ -352,11 +352,8 @@ void sofia_event_callback(nua_event_t event, sofia_reg_release_gateway(gateway); } - if (tech_pvt) { - switch_mutex_unlock(tech_pvt->flag_mutex); - } - if (session) { + switch_core_session_signal_unlock(session); switch_core_session_rwunlock(session); } } diff --git a/src/switch_core_memory.c b/src/switch_core_memory.c index 10510bacfd..1835d388b0 100644 --- a/src/switch_core_memory.c +++ b/src/switch_core_memory.c @@ -35,7 +35,7 @@ #include <switch.h> #include "private/switch_core_pvt.h" /*#define LOCK_MORE*/ -#define PER_POOL_LOCK 1 +/*#define PER_POOL_LOCK 1*/ static struct { switch_mutex_t *mem_lock; diff --git a/src/switch_core_rwlock.c b/src/switch_core_rwlock.c index 1e6e35cd75..0bec5c935a 100644 --- a/src/switch_core_rwlock.c +++ b/src/switch_core_rwlock.c @@ -35,6 +35,17 @@ #include <switch.h> #include "private/switch_core_pvt.h" + +SWITCH_DECLARE(switch_status_t) switch_core_session_signal_lock(switch_core_session_t *session) +{ + return switch_mutex_lock(session->signal_mutex); +} + +SWITCH_DECLARE(switch_status_t) switch_core_session_signal_unlock(switch_core_session_t *session) +{ + return switch_mutex_unlock(session->signal_mutex); +} + #ifdef SWITCH_DEBUG_RWLOCKS SWITCH_DECLARE(switch_status_t) switch_core_session_perform_read_lock(switch_core_session_t *session, const char *file, const char *func, int line) #else diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 9a3e7a396a..d5c06b7ea2 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -347,6 +347,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_receive_message(switch_core_ return status; } + + switch_core_session_signal_lock(session); + if (session->endpoint_interface->io_routines->receive_message) { status = session->endpoint_interface->io_routines->receive_message(session, message); } @@ -360,6 +363,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_receive_message(switch_core_ } switch_core_session_kill_channel(session, SWITCH_SIG_BREAK); + + switch_core_session_signal_unlock(session); + switch_core_session_rwunlock(session); return status; @@ -831,6 +837,7 @@ SWITCH_DECLARE(switch_core_session_t *) switch_core_session_request(const switch switch_mutex_init(&session->mutex, SWITCH_MUTEX_NESTED, session->pool); switch_mutex_init(&session->resample_mutex, SWITCH_MUTEX_NESTED, session->pool); + switch_mutex_init(&session->signal_mutex, SWITCH_MUTEX_NESTED, session->pool); switch_thread_rwlock_create(&session->bug_rwlock, session->pool); switch_thread_cond_create(&session->cond, session->pool); switch_thread_rwlock_create(&session->rwlock, session->pool);