[asterisk-commits] trunk r20653 - /trunk/res/res_features.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Sun Apr 16 13:32:16 MST 2006


Author: rizzo
Date: Sun Apr 16 15:32:14 2006
New Revision: 20653

URL: http://svn.digium.com/view/asterisk?rev=20653&view=rev
Log:
localize several variables, and simplify the last part of park_exec()


Modified:
    trunk/res/res_features.c

Modified: trunk/res/res_features.c
URL: http://svn.digium.com/view/asterisk/trunk/res/res_features.c?rev=20653&r1=20652&r2=20653&view=diff
==============================================================================
--- trunk/res/res_features.c (original)
+++ trunk/res/res_features.c Sun Apr 16 15:32:14 2006
@@ -1269,7 +1269,7 @@
 	if (ast_answer(chan))
 		return -1;
 	peer->appl = "Bridged Call";
-	peer->data = (char *) chan->name;
+	peer->data = chan->name;
 
 	/* copy the userfield from the B-leg to A-leg if applicable */
 	if (chan->cdr && peer->cdr && !ast_strlen_zero(peer->cdr->userfield)) {
@@ -1365,7 +1365,7 @@
 			else if (f->subclass == AST_CONTROL_OPTION) {
 				aoh = f->data;
 				/* Forward option Requests */
-				if (aoh && (aoh->flag == AST_OPTION_FLAG_REQUEST))
+				if (aoh && aoh->flag == AST_OPTION_FLAG_REQUEST)
 					ast_channel_setoption(other, ntohs(aoh->option), aoh->data, f->datalen - sizeof(struct ast_option_header), 0);
 			}
 		}
@@ -1435,7 +1435,7 @@
 /*! \brief Take care of parked calls and unpark them if needed */
 static void *do_parking_thread(void *ignore)
 {
-	fd_set rfds, efds;
+	fd_set rfds, efds;	/* results from previous select, to be preserved across loops. */
 	FD_ZERO(&rfds);
 	FD_ZERO(&efds);
 
@@ -1443,26 +1443,21 @@
 		struct parkeduser *pu, *pl, *pt = NULL;
 		int ms = -1;	/* select timeout, uninitialized */
 		int max = -1;	/* max fd, none there yet */
-		fd_set nrfds, nefds;
-
-		struct timeval tv;
-		char exten[AST_MAX_EXTENSION];
-		char *peername,*cp;
-
+		fd_set nrfds, nefds;	/* args for the next select */
 		FD_ZERO(&nrfds);
 		FD_ZERO(&nefds);
 
 		ast_mutex_lock(&parking_lock);
 		pl = NULL;
 		pu = parkinglot;
+		/* navigate the list with prev-cur pointers to support removals */
 		while(pu) {
 			struct ast_channel *chan = pu->chan;	/* shorthand */
 			int tms;        /* timeout for this item */
 			int x;          /* fd index in channel */
 			struct ast_context *con;
 
-			if (pu->notquiteyet) {
-				/* Pretend this one isn't here yet */
+			if (pu->notquiteyet) { /* Pretend this one isn't here yet */
 				pl = pu;
 				pu = pu->next;
 				continue;
@@ -1474,8 +1469,8 @@
 				ast_indicate(chan, AST_CONTROL_UNHOLD);
 				/* Get chan, exten from derived kludge */
 				if (pu->peername[0]) {
-					peername = ast_strdupa(pu->peername);
-					cp = strrchr(peername, '-');
+					char *peername = ast_strdupa(pu->peername);
+					char *cp = strrchr(peername, '-');
 					if (cp) 
 						*cp = 0;
 					con = ast_context_find(parking_con_dial);
@@ -1523,18 +1518,19 @@
 				pu = pu->next;
 				con = ast_context_find(parking_con);
 				if (con) {
+					char exten[AST_MAX_EXTENSION];
 					snprintf(exten, sizeof(exten), "%d", pt->parkingnum);
 					if (ast_context_remove_extension2(con, exten, 1, NULL))
 						ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n");
 				} else
 					ast_log(LOG_WARNING, "Whoa, no parking context?\n");
 				free(pt);
-			} else {
+			} else {	/* still within parking time, process descriptors */
 				for (x = 0; x < AST_MAX_FDS; x++) {
 					struct ast_frame *f;
 
-					if (chan->fds[x] < 0 || (!FD_ISSET(chan->fds[x], &rfds) && !FD_ISSET(chan->fds[x], &efds)))
-						continue;
+					if (chan->fds[x] == -1 || (!FD_ISSET(chan->fds[x], &rfds) && !FD_ISSET(chan->fds[x], &efds)))
+						continue;	/* nothing on this descriptor */
 
 					if (FD_ISSET(chan->fds[x], &efds))
 						ast_set_flag(chan, AST_FLAG_EXCEPTION);
@@ -1543,7 +1539,7 @@
 					chan->fdno = x;
 					/* See if they need servicing */
 					f = ast_read(chan);
-					if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass ==  AST_CONTROL_HANGUP))) {
+					if (!f || (f->frametype == AST_FRAME_CONTROL && f->subclass ==  AST_CONTROL_HANGUP)) {
 						if (f)
 							ast_frfree(f);
 						manager_event(EVENT_FLAG_CALL, "ParkedCallGiveUp",
@@ -1569,6 +1565,7 @@
 						pu = pu->next;
 						con = ast_context_find(parking_con);
 						if (con) {
+							char exten[AST_MAX_EXTENSION];
 							snprintf(exten, sizeof(exten), "%d", pt->parkingnum);
 							if (ast_context_remove_extension2(con, exten, 1, NULL))
 								ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n");
@@ -1589,8 +1586,7 @@
 
 				} /* end for */
 				if (x >= AST_MAX_FDS) {
-std:					for (x=0; x<AST_MAX_FDS; x++) {
-						/* Keep this one for next one */
+std:					for (x=0; x<AST_MAX_FDS; x++) {	/* mark fds for next round */
 						if (chan->fds[x] > -1) {
 							FD_SET(chan->fds[x], &nrfds);
 							FD_SET(chan->fds[x], &nefds);
@@ -1598,8 +1594,8 @@
 								max = chan->fds[x];
 						}
 					}
-					/* Keep track of our longest wait */
-					if ((tms < ms) || (ms < 0))
+					/* Keep track of our shortest wait */
+					if (tms < ms || ms < 0)
 						ms = tms;
 					pl = pu;
 					pu = pu->next;
@@ -1609,9 +1605,11 @@
 		ast_mutex_unlock(&parking_lock);
 		rfds = nrfds;
 		efds = nefds;
-		tv = ast_samp2tv(ms, 1000);
-		/* Wait for something to happen */
-		ast_select(max + 1, &rfds, NULL, &efds, (ms > -1) ? &tv : NULL);
+		{
+			struct timeval tv = ast_samp2tv(ms, 1000);
+			/* Wait for something to happen */
+			ast_select(max + 1, &rfds, NULL, &efds, (ms > -1) ? &tv : NULL);
+		}
 		pthread_testcancel();
 	}
 	return NULL;	/* Never reached */
@@ -1646,7 +1644,6 @@
 	struct localuser *u;
 	struct ast_channel *peer=NULL;
 	struct parkeduser *pu, *pl=NULL;
-	char exten[AST_MAX_EXTENSION];
 	struct ast_context *con;
 	int park;
 	int dres;
@@ -1676,6 +1673,7 @@
 		peer = pu->chan;
 		con = ast_context_find(parking_con);
 		if (con) {
+			char exten[AST_MAX_EXTENSION];
 			snprintf(exten, sizeof(exten), "%d", pu->parkingnum);
 			if (ast_context_remove_extension2(con, exten, 1, NULL))
 				ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n");
@@ -1696,47 +1694,37 @@
 		free(pu);
 	}
 	/* JK02: it helps to answer the channel if not already up */
-	if (chan->_state != AST_STATE_UP) {
+	if (chan->_state != AST_STATE_UP)
 		ast_answer(chan);
-	}
 
 	if (peer) {
 		/* Play a courtesy to the source(s) configured to prefix the bridge connecting */
 		
 		if (!ast_strlen_zero(courtesytone)) {
+			int error = 0;
+			ast_moh_stop(peer);
+			ast_indicate(peer, AST_CONTROL_UNHOLD);
 			if (parkedplay == 0) {
-				if (!ast_streamfile(chan, courtesytone, chan->language)) {
-					if (ast_waitstream(chan, "") < 0) {
-						ast_log(LOG_WARNING, "Failed to play courtesy tone!\n");
-						ast_hangup(peer);
-						return -1;
-					}
+				if (stream_and_wait(chan, courtesytone, chan->language, ""))
+					error = 1;
+			} else if (parkedplay == 2) {
+				if (!ast_streamfile(chan, courtesytone, chan->language) &&
+						!ast_streamfile(peer, courtesytone, chan->language)) {
+					/* XXX we would like to wait on both! */
+					res = ast_waitstream(chan, "");
+					if (res >= 0)
+						res = ast_waitstream(peer, "");
+					if (res < 0)
+						error = 1;
 				}
-				ast_moh_stop(peer);
-				ast_indicate(peer, AST_CONTROL_UNHOLD);
-			} else {
-				ast_moh_stop(peer);
-				ast_indicate(peer, AST_CONTROL_UNHOLD);
-				if (parkedplay == 2) {
-					if (!ast_streamfile(chan, courtesytone, chan->language) && !ast_streamfile(peer, courtesytone, chan->language)) {
-						res = ast_waitstream(chan, "");
-						if (res >= 0)
-							res = ast_waitstream(peer, "");
-						if (res < 0) {
-							ast_log(LOG_WARNING, "Failed to play courtesy tones!\n");
-							ast_hangup(peer);
-							return -1;
-						}
-					}
-				} else if (parkedplay == 1) {
-					if (!ast_streamfile(peer, courtesytone, chan->language)) {
-						if (ast_waitstream(peer, "") < 0) {
-							ast_log(LOG_WARNING, "Failed to play courtesy tone!\n");
-							ast_hangup(peer);
-							return -1;
-						}
-					}
-				}
+			} else if (parkedplay == 1) {
+				if (stream_and_wait(peer, courtesytone, chan->language, ""))
+				error = 1;
+                        }
+			if (error) {
+				ast_log(LOG_WARNING, "Failed to play courtesy tone!\n");
+				ast_hangup(peer);
+				return -1;
 			}
 		}
  



More information about the asterisk-commits mailing list