From: Anthony Minessale Date: Fri, 19 Nov 2010 17:16:18 +0000 (-0600) Subject: refactor codec_destroy to prevent race X-Git-Tag: v1.2-rc1~265^2~4^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8c9f23ea566ac746eb4ed40cdd7816309dffaa45;p=thirdparty%2Ffreeswitch.git refactor codec_destroy to prevent race --- diff --git a/src/switch_core_codec.c b/src/switch_core_codec.c index 9b607ea873..d6b627093e 100644 --- a/src/switch_core_codec.c +++ b/src/switch_core_codec.c @@ -672,14 +672,19 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_decode(switch_codec_t *codec, SWITCH_DECLARE(switch_status_t) switch_core_codec_destroy(switch_codec_t *codec) { - switch_mutex_t *mutex; - switch_memory_pool_t *pool; + switch_mutex_t *mutex = codec->mutex; + switch_memory_pool_t *pool = codec->memory_pool; int free_pool = 0; switch_assert(codec != NULL); - if (!switch_core_codec_ready(codec)) { + if (mutex) switch_mutex_lock(mutex); + + if (switch_core_codec_ready(codec)) { + switch_clear_flag(codec, SWITCH_CODEC_FLAG_READY); + } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Codec is not initialized!\n"); + if (mutex) switch_mutex_unlock(mutex); return SWITCH_STATUS_NOT_INITALIZED; } @@ -687,23 +692,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_destroy(switch_codec_t *codec) free_pool = 1; } - pool = codec->memory_pool; - mutex = codec->mutex; - - if (mutex) { - switch_mutex_lock(mutex); - switch_clear_flag(codec, SWITCH_CODEC_FLAG_READY); - switch_mutex_unlock(mutex); - switch_mutex_lock(mutex); - } - codec->implementation->destroy(codec); UNPROTECT_INTERFACE(codec->codec_interface); - if (mutex) { - switch_mutex_unlock(mutex); - } + if (mutex) switch_mutex_unlock(mutex); if (free_pool) { switch_core_destroy_memory_pool(&pool);