[Asterisk-cvs] asterisk/channels chan_iax2.c,1.111,1.112

markster at lists.digium.com markster at lists.digium.com
Mon Mar 22 20:00:21 CST 2004


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv7298/channels

Modified Files:
	chan_iax2.c 
Log Message:
Hold owner lock when changing codecs


Index: chan_iax2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -d -r1.111 -r1.112
--- chan_iax2.c	21 Mar 2004 11:23:10 -0000	1.111
+++ chan_iax2.c	23 Mar 2004 00:56:36 -0000	1.112
@@ -4948,11 +4948,21 @@
 						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);




More information about the svn-commits mailing list