[asterisk-commits] file: branch 1.4 r46775 - /branches/1.4/channels/chan_iax2.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed Nov 1 11:21:35 MST 2006


Author: file
Date: Wed Nov  1 12:21:34 2006
New Revision: 46775

URL: http://svn.digium.com/view/asterisk?rev=46775&view=rev
Log:
It's another round of chan_iax2 fixes! Should hopefully fix the deadlock issues people have been reporting. IAXtel now has qualify turned on for 800 peers and it is handling it fine.

Modified:
    branches/1.4/channels/chan_iax2.c

Modified: branches/1.4/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_iax2.c?rev=46775&r1=46774&r2=46775&view=diff
==============================================================================
--- branches/1.4/channels/chan_iax2.c (original)
+++ branches/1.4/channels/chan_iax2.c Wed Nov  1 12:21:34 2006
@@ -4957,18 +4957,10 @@
 		ast_log(LOG_NOTICE, "Empty registration from %s\n", ast_inet_ntoa(sin->sin_addr));
 		return -1;
 	}
-	/* We release the lock for the call to prevent a deadlock, but it's okay because
-	   only the current thread could possibly make it go away or make changes */
-	ast_mutex_unlock(&iaxsl[callno]);
+
 	/* SLD: first call to lookup peer during registration */
 	p = find_peer(peer, 1);
-	ast_mutex_lock(&iaxsl[callno]);
-
-	if (!iaxs[callno]) {
-		/* Call has disappeared */
-		ast_mutex_unlock(&iaxsl[callno]);
-		return -1;
-	}
+
 	if (!p) {
 		if (authdebug)
 			ast_log(LOG_NOTICE, "No registration for peer '%s' (from %s)\n", peer, ast_inet_ntoa(sin->sin_addr));
@@ -5620,6 +5612,11 @@
 		/* Verify that the host is really there */
 		iax2_poke_peer(p, callno);
 	}		
+
+	/* Make sure our call still exists, an INVAL at the right point may make it go away */
+	if (!iaxs[callno])
+		return 0;
+
 	/* Store socket fd */
 	p->sockfd = fd;
 	/* Setup the expiry */
@@ -8059,13 +8056,19 @@
 			if (f->sentyet)
 				continue;
 			
+			/* Try to lock the pvt, if we can't... don't fret - defer it till later */
+			if (ast_mutex_trylock(&iaxsl[f->callno]))
+				continue;
+
 			f->sentyet++;
-			ast_mutex_lock(&iaxsl[f->callno]);
+
 			if (iaxs[f->callno]) {
 				send_packet(f);
 				count++;
 			} 
+
 			ast_mutex_unlock(&iaxsl[f->callno]);
+
 			if (f->retries < 0) {
 				/* This is not supposed to be retransmitted */
 				AST_LIST_REMOVE(&iaxq.queue, f, list);
@@ -8717,15 +8720,8 @@
 
 static void destroy_peer(struct iax2_peer *peer)
 {
-	int x;
 	ast_free_ha(peer->ha);
-	for (x=0;x<IAX_MAX_CALLS;x++) {
-		ast_mutex_lock(&iaxsl[x]);
-		if (iaxs[x] && (iaxs[x]->peerpoke == peer)) {
-			iax2_destroy(x);
-		}
-		ast_mutex_unlock(&iaxsl[x]);
-	}
+
 	/* Delete it, it needs to disappear */
 	if (peer->expire > -1)
 		ast_sched_del(sched, peer->expire);
@@ -8733,10 +8729,14 @@
 		ast_sched_del(sched, peer->pokeexpire);
 	if (peer->callno > 0)
 		iax2_destroy(peer->callno);
+
 	register_peer_exten(peer, 0);
+
 	if (peer->dnsmgr)
 		ast_dnsmgr_release(peer->dnsmgr);
+
 	ast_string_field_free_pools(peer);
+
 	free(peer);
 }
 



More information about the asterisk-commits mailing list