[Asterisk-cvs] asterisk/channels chan_iax2.c,1.132,1.133 chan_mgcp.c,1.47,1.48

markster at lists.digium.com markster at lists.digium.com
Wed Apr 28 00:16:49 CDT 2004


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

Modified Files:
	chan_iax2.c chan_mgcp.c 
Log Message:
Fix deadlock in IAX2 trunking, small MGCP fix


Index: chan_iax2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -d -r1.132 -r1.133
--- chan_iax2.c	27 Apr 2004 15:18:55 -0000	1.132
+++ chan_iax2.c	28 Apr 2004 04:23:14 -0000	1.133
@@ -2576,7 +2576,7 @@
 	return ms;
 }
 
-static unsigned int fix_peerts(struct iax2_trunk_peer *peer, int callno, unsigned int ts)
+static unsigned int fix_peerts(struct timeval *tv, int callno, unsigned int ts)
 {
 	long ms;	/* NOT unsigned */
 	if (!iaxs[callno]->rxcore.tv_sec && !iaxs[callno]->rxcore.tv_usec) {
@@ -2586,8 +2586,8 @@
 		iaxs[callno]->rxcore.tv_usec -= iaxs[callno]->rxcore.tv_usec % 20000;
 	}
 	/* Calculate difference between trunk and channel */
-	ms = (peer->rxtrunktime.tv_sec - iaxs[callno]->rxcore.tv_sec) * 1000 + 
-		(peer->rxtrunktime.tv_usec - iaxs[callno]->rxcore.tv_usec) / 1000;
+	ms = (tv->tv_sec - iaxs[callno]->rxcore.tv_sec) * 1000 + 
+		(tv->tv_usec - iaxs[callno]->rxcore.tv_usec) / 1000;
 	/* Return as the sum of trunk time and the difference between trunk and real time */
 	return ms + ts;
 }
@@ -4570,6 +4570,7 @@
 	struct iax2_dpcache *dp;
 	struct iax2_peer *peer;
 	struct iax2_trunk_peer *tpeer;
+	struct timeval rxtrunktime;
 	struct iax_ies ies;
 	struct iax_ie_data ied0, ied1;
 	int format;
@@ -4618,6 +4619,8 @@
 				tpeer->trunkact = tpeer->rxtrunktime;
 			} else
 				gettimeofday(&tpeer->trunkact, NULL);
+			rxtrunktime = tpeer->rxtrunktime;
+			ast_mutex_unlock(&tpeer->lock);
 			while(res >= sizeof(struct ast_iax2_meta_trunk_entry)) {
 				/* Process channels */
 				mte = (struct ast_iax2_meta_trunk_entry *)ptr;
@@ -4643,7 +4646,7 @@
 									f.data = ptr;
 								else
 									f.data = NULL;
-								fr.ts = fix_peerts(tpeer, fr.callno, ts);
+								fr.ts = fix_peerts(&rxtrunktime, fr.callno, ts);
 								/* Don't pass any packets until we're started */
 								if ((iaxs[fr.callno]->state & IAX_STATE_STARTED)) {
 									/* Common things */
@@ -4679,7 +4682,6 @@
 				ptr += len;
 				res -= len;
 			}
-			ast_mutex_unlock(&tpeer->lock);
 			
 		}
 		return 1;

Index: chan_mgcp.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_mgcp.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -d -r1.47 -r1.48
--- chan_mgcp.c	27 Apr 2004 21:18:02 -0000	1.47
+++ chan_mgcp.c	28 Apr 2004 04:23:14 -0000	1.48
@@ -3912,7 +3912,8 @@
 		close(mgcpsock);
 
 	if (mgcpsock_read_id != NULL)
-		mgcpsock_read_id = ast_io_remove(io, mgcpsock_read_id);
+		ast_io_remove(io, mgcpsock_read_id);
+	mgcpsock_read_id = NULL;
 
 	mgcpsock = socket(AF_INET, SOCK_DGRAM, 0);
 	if (mgcpsock < 0) {




More information about the svn-commits mailing list