From 3107d6d03b56cd8f7db78d04a8ecae0d91f9618a Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Tue, 23 Mar 2004 00:56:36 +0000
Subject: [PATCH] Hold owner lock when changing codecs

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2529 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_iax2.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 5b17fa4647..404f32ad7d 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -4948,11 +4948,21 @@ retryowner:
 						iaxs[fr.callno]->owner->nativeformats = iaxs[fr.callno]->peerformat;
 						if (option_verbose > 2)
 							ast_verbose(VERBOSE_PREFIX_3 "Format for call is %s\n", ast_getformatname(iaxs[fr.callno]->owner->nativeformats));
-						/* Setup read/write formats properly. */
-						if (iaxs[fr.callno]->owner->writeformat)
-							ast_set_write_format(iaxs[fr.callno]->owner, iaxs[fr.callno]->owner->writeformat);	
-						if (iaxs[fr.callno]->owner->readformat)
-							ast_set_read_format(iaxs[fr.callno]->owner, iaxs[fr.callno]->owner->readformat);	
+retryowner2:
+						if (ast_mutex_trylock(&iaxs[fr.callno]->owner->lock)) {
+							ast_mutex_unlock(&iaxsl[fr.callno]);
+							usleep(1);
+							ast_mutex_lock(&iaxsl[fr.callno]);
+							if (iaxs[fr.callno] && iaxs[fr.callno]->owner) goto retryowner2;
+						}
+						
+						if (iaxs[fr.callno] && iaxs[fr.callno]->owner) {
+							/* Setup read/write formats properly. */
+							if (iaxs[fr.callno]->owner->writeformat)
+								ast_set_write_format(iaxs[fr.callno]->owner, iaxs[fr.callno]->owner->writeformat);	
+							if (iaxs[fr.callno]->owner->readformat)
+								ast_set_read_format(iaxs[fr.callno]->owner, iaxs[fr.callno]->owner->readformat);	
+						}
 					}
 				}
 				ast_mutex_lock(&dpcache_lock);
-- 
GitLab