[svn-commits] irroot: branch irroot/distrotech-customers-1.8 r325484 - in /team/irroot/dist...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Jun 29 01:46:56 CDT 2011


Author: irroot
Date: Wed Jun 29 01:46:52 2011
New Revision: 325484

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=325484
Log:
Remove Deadlock avoidance added to chan_sip.c these measures are resolved upstream

Modified:
    team/irroot/distrotech-customers-1.8/channels/chan_sip.c
    team/irroot/distrotech-customers-1.8/res/res_timing_timerfd.c

Modified: team/irroot/distrotech-customers-1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/irroot/distrotech-customers-1.8/channels/chan_sip.c?view=diff&rev=325484&r1=325483&r2=325484
==============================================================================
--- team/irroot/distrotech-customers-1.8/channels/chan_sip.c (original)
+++ team/irroot/distrotech-customers-1.8/channels/chan_sip.c Wed Jun 29 01:46:52 2011
@@ -6105,10 +6105,7 @@
 	} else
 		ast_debug(1, "Hangup call %s, SIP callid %s\n", ast->name, p->callid);
 
-	while (sip_pvt_trylock(p)) {
-		CHANNEL_DEADLOCK_AVOIDANCE(ast);
-	}
-
+	sip_pvt_lock(p);
 	if (ast_test_flag(&p->flags[0], SIP_INC_COUNT) || ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) {
 		if (sipdebug)
 			ast_debug(1, "update_call_counter(%s) - decrement call limit counter on hangup\n", p->username);
@@ -6334,9 +6331,7 @@
 			return 0;
 		}
 		if (p) {
-			while (sip_pvt_trylock(p)) {
-				CHANNEL_DEADLOCK_AVOIDANCE(ast);
-			}
+			sip_pvt_lock(p);
 			if (p->t38.state == T38_ENABLED) {
 				/* drop frame, can't sent VOICE frames while in T.38 mode */
 				sip_pvt_unlock(p);
@@ -6635,9 +6630,7 @@
 	struct sip_pvt *p = ast->tech_pvt;
 	int res = 0;
 
-	while (sip_pvt_trylock(p)) {
-		CHANNEL_DEADLOCK_AVOIDANCE(ast);
-	}
+	sip_pvt_lock(p);
 	switch(condition) {
 	case AST_CONTROL_RINGING:
 		if (ast->_state == AST_STATE_RING) {
@@ -7247,10 +7240,7 @@
 	struct sip_pvt *p = ast->tech_pvt;
 	int faxdetected = FALSE;
 
-	while (sip_pvt_trylock(p)) {
-		CHANNEL_DEADLOCK_AVOIDANCE(ast);
-	}
-
+	sip_pvt_lock(p);
 	fr = sip_rtp_read(ast, p, &faxdetected);
 	p->lastrtprx = time(NULL);
 
@@ -28209,10 +28199,7 @@
 		return AST_RTP_GLUE_RESULT_FORBID;
 	}
 
-	while (sip_pvt_trylock(p)) {
-		CHANNEL_DEADLOCK_AVOIDANCE(chan);
-	}
-
+	sip_pvt_lock(p);
 	if (!(p->rtp)) {
 		sip_pvt_unlock(p);
 		return AST_RTP_GLUE_RESULT_FORBID;

Modified: team/irroot/distrotech-customers-1.8/res/res_timing_timerfd.c
URL: http://svnview.digium.com/svn/asterisk/team/irroot/distrotech-customers-1.8/res/res_timing_timerfd.c?view=diff&rev=325484&r1=325483&r2=325484
==============================================================================
--- team/irroot/distrotech-customers-1.8/res/res_timing_timerfd.c (original)
+++ team/irroot/distrotech-customers-1.8/res/res_timing_timerfd.c Wed Jun 29 01:46:52 2011
@@ -162,7 +162,35 @@
 	uint64_t expirations;
 	int read_result = 0;
 
+	struct timerfd_timer *our_timer, find_helper = {
+		.handle = handle,
+	};
+
+	if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) {
+//		ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
+		return;
+	}
+
+	if (our_timer->saved_timer.it_value.tv_nsec == 0L) {
+//		ast_log(LOG_WARNING, "Reading attempt on idle timerfd. This would have caused a deadlock.\n");
+		return;
+	}
+
 	do {
+		struct itimerspec timer_status;
+
+		if (timerfd_gettime(handle, &timer_status)) {
+//			ast_log(LOG_ERROR, "Call to timerfd_gettime() error: %s\n", strerror(errno));
+			expirations = 0;
+			break;
+		}
+
+		if ((timer_status.it_value.tv_sec == 0) && (timer_status.it_value.tv_nsec == 0)) {
+//			ast_log(LOG_ERROR, "Call to timerfd_timer_ack() with disarmed timer - break now to avoiding deadlock!\n");
+			expirations = 0;
+			break;
+		}
+
 		read_result = read(handle, &expirations, sizeof(expirations));
 		if (read_result == -1) {
 			if (errno == EINTR || errno == EAGAIN) {




More information about the svn-commits mailing list