diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h index e615f8403a..3cb497975a 100644 --- a/src/include/switch_module_interfaces.h +++ b/src/include/switch_module_interfaces.h @@ -633,8 +633,8 @@ struct switch_api_interface { struct switch_api_interface *next; }; -#define PROTECT_INTERFACE(_it) if (!_it->refs) {switch_thread_rwlock_rdlock(_it->parent->rwlock); switch_thread_rwlock_rdlock(_it->rwlock); _it->refs++; _it->parent->refs++;} -#define UNPROTECT_INTERFACE(_it) if (_it->refs) {switch_thread_rwlock_unlock(_it->rwlock); switch_thread_rwlock_unlock(_it->parent->rwlock); _it->refs--; _it->parent->refs--; _it = NULL;} +#define PROTECT_INTERFACE(_it) if (_it && !_it->refs) {switch_thread_rwlock_rdlock(_it->parent->rwlock); switch_thread_rwlock_rdlock(_it->rwlock); _it->refs++; _it->parent->refs++;} //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "+++++++++++LOCK\n"); +#define UNPROTECT_INTERFACE(_it) if (_it && _it->refs) {switch_thread_rwlock_unlock(_it->rwlock); switch_thread_rwlock_unlock(_it->parent->rwlock); _it->refs--; _it->parent->refs--; _it = NULL;} //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "-----------UNLOCK\n"); SWITCH_END_EXTERN_C #endif diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 96354feac0..90f9fe4bc4 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -373,6 +373,17 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session) switch_safe_free(stream.data); } + if (tech_pvt->read_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->read_codec); + } + + if (tech_pvt->write_codec.implementation) { + switch_core_codec_destroy(&tech_pvt->write_codec); + } + + switch_core_session_unset_read_codec(session); + switch_core_session_unset_write_codec(session); + switch_mutex_lock(tech_pvt->profile->flag_mutex); switch_clear_flag(tech_pvt, TFLAG_IO); tech_pvt->profile->inuse--; diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index 5706494a7f..ca10db6fa4 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -1479,9 +1479,12 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ found: + UNPROTECT_INTERFACE(codec_interface); + if (i > arraylen) { break; } + } }