[svn-commits] moy: branch moy/mfcr2-1.4 r129309 - /team/moy/mfcr2-1.4/channels/chan_zap.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Jul 8 23:17:26 CDT 2008


Author: moy
Date: Tue Jul  8 23:17:25 2008
New Revision: 129309

URL: http://svn.digium.com/view/asterisk?view=rev&rev=129309
Log:
fixed race condition between incoming and outgoing calls

Modified:
    team/moy/mfcr2-1.4/channels/chan_zap.c

Modified: team/moy/mfcr2-1.4/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2-1.4/channels/chan_zap.c?view=diff&rev=129309&r1=129308&r2=129309
==============================================================================
--- team/moy/mfcr2-1.4/channels/chan_zap.c (original)
+++ team/moy/mfcr2-1.4/channels/chan_zap.c Tue Jul  8 23:17:25 2008
@@ -899,16 +899,22 @@
 
 static void zt_r2_on_call_init(openr2_chan_t *r2chan)
 {
+	/* TODO: how do we know that an external thread (just finished zt_request) is not requesting this very same
+	   interface but has not yet seized the line, and if we DO know, what to do here? */
 	struct zt_pvt *p = openr2_chan_get_client_data(r2chan);
+	ast_mutex_lock(&p->lock);
 	p->mfcr2call = 1;
+	ast_mutex_unlock(&p->lock);
 	ast_log(LOG_NOTICE, "New MFC/R2 call detected on chan %d.\n", openr2_chan_get_number(r2chan));
 }
 
 static void zt_r2_on_hardware_alarm(openr2_chan_t *r2chan, int alarm)
 {
 	struct zt_pvt *p = openr2_chan_get_client_data(r2chan);
+	ast_mutex_lock(&p->lock);
+	p->inalarm = alarm ? 1 : 0;
+	ast_mutex_unlock(&p->lock);
 	ast_log(LOG_WARNING, "Zap alarm on chan %d.\n", openr2_chan_get_number(r2chan));
-	p->inalarm = alarm ? 1 : 0;
 }
 
 static void zt_r2_on_os_error(openr2_chan_t *r2chan, int errorcode)
@@ -924,6 +930,9 @@
 		p->owner->hangupcause = AST_CAUSE_PROTOCOL_ERROR;
 		p->owner->_softhangup |= AST_SOFTHANGUP_DEV;
 	} 
+	ast_mutex_lock(&p->lock);
+	p->mfcr2call = 0;
+	ast_mutex_unlock(&p->lock);
 }
 
 static void zt_r2_on_call_offered(openr2_chan_t *r2chan, const char *ani, const char *dnis, openr2_calling_party_category_t category)
@@ -960,7 +969,11 @@
 
 static void zt_r2_on_call_end(openr2_chan_t *r2chan)
 {
-	ast_log(LOG_NOTICE, "MFC/R2 call end on chan %d\n", openr2_chan_get_number(r2chan));
+	struct zt_pvt *p = openr2_chan_get_client_data(r2chan);
+	ast_log(LOG_NOTICE, "MFC/R2 call end on chan %d\n", p->channel);
+	ast_mutex_lock(&p->lock);
+	p->mfcr2call = 0;
+	ast_mutex_unlock(&p->lock);
 }
 
 static void zt_r2_update_monitor_count(struct zt_mfcr2 *mfcr2, int increment)
@@ -1051,9 +1064,11 @@
 {
 	struct zt_pvt *p = openr2_chan_get_client_data(r2chan);
 	ast_log(LOG_NOTICE, "MFC/R2 call disconnected on chan %d\n", openr2_chan_get_number(r2chan));
+	ast_mutex_lock(&p->lock);
 	if (p->owner) {
 		if (p->owner->_state == AST_STATE_UP) {
 			p->owner->_softhangup |= AST_SOFTHANGUP_DEV;
+			ast_mutex_unlock(&p->lock);
 		} else if (openr2_chan_get_direction(r2chan) == OR2_DIR_FORWARD) {
 			/* being the forward side we must report what happened to the call to whoever requested it */
 			switch (cause) {
@@ -1071,7 +1086,9 @@
 			default:
 				p->owner->_softhangup |= AST_SOFTHANGUP_DEV;
 			}
+			ast_mutex_unlock(&p->lock);
 		} else {
+			ast_mutex_unlock(&p->lock);
 			/* being the backward side and not UP yet, we only need to request hangup */
 			/* TODO: what about doing this same thing when were AST_STATE_UP? */
 			ast_queue_hangup(p->owner);
@@ -8547,9 +8564,6 @@
 			if (mfcr2->pvts[i]->owner) {
 				continue;
 			}
-			if (mfcr2->pvts[i]->mfcr2call) {
-				mfcr2->pvts[i]->mfcr2call = 0;
-			}
 			openr2_chan_enable_read(mfcr2->pvts[i]->r2chan);
 			pollers[i].events = POLLIN | POLLPRI;
 			pollers[i].fd = mfcr2->pvts[i]->subs[SUB_REAL].zfd;
@@ -10639,7 +10653,6 @@
 			continue;
 		}
 		openr2_proto_set_idle(p->r2chan);
-		openr2_proto_handle_abcd_change(p->r2chan);
 		if (channo != -1) {
 			break;
 		} else {
@@ -10670,7 +10683,6 @@
 			continue;
 		}
 		openr2_proto_set_blocked(p->r2chan);
-		openr2_proto_handle_abcd_change(p->r2chan);
 		if (channo != -1) {
 			break;
 		} else {




More information about the svn-commits mailing list