From 2990ef8cd477873c3c4782e1b84aa48065ac77d0 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 13 Nov 2008 23:07:03 +0000 Subject: [PATCH] fix codec issue git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10390 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_module_interfaces.h | 4 ++-- src/mod/endpoints/mod_sofia/mod_sofia.c | 11 +++++++++++ src/switch_loadable_module.c | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) 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; } + } }