[svn-commits] jpeeler: branch jpeeler/asterisk-sigwork-trunk r196273 - /team/jpeeler/asteri...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri May 22 11:54:15 CDT 2009


Author: jpeeler
Date: Fri May 22 11:54:11 2009
New Revision: 196273

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=196273
Log:
Add callbacks to increase/decrease analog_ss_thread counts from within sig_analog. This is a lot of code to do so little, but should be done this way until the analog_ss_thread in chan_dahdi completely goes away.

Modified:
    team/jpeeler/asterisk-sigwork-trunk/channels/chan_dahdi.c
    team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.c
    team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.h

Modified: team/jpeeler/asterisk-sigwork-trunk/channels/chan_dahdi.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/jpeeler/asterisk-sigwork-trunk/channels/chan_dahdi.c?view=diff&rev=196273&r1=196272&r2=196273
==============================================================================
--- team/jpeeler/asterisk-sigwork-trunk/channels/chan_dahdi.c (original)
+++ team/jpeeler/asterisk-sigwork-trunk/channels/chan_dahdi.c Fri May 22 11:54:11 2009
@@ -1839,6 +1839,21 @@
 	ast_mutex_unlock(&p->lock);
 }
 
+static void my_increase_ss_count(void)
+{
+	ast_mutex_lock(&ss_thread_lock);
+	ss_thread_count++;
+	ast_mutex_unlock(&ss_thread_lock);
+}
+
+static void my_decrease_ss_count(void)
+{
+	ast_mutex_lock(&ss_thread_lock);
+	ss_thread_count--;
+	ast_cond_signal(&ss_thread_complete);
+	ast_mutex_unlock(&ss_thread_lock);
+}
+
 static void my_all_subchannels_hungup(void *pvt)
 {
 	struct dahdi_pvt *p = pvt;
@@ -2337,6 +2352,8 @@
 	.start_cid_detect = my_start_cid_detect,
 	.stop_cid_detect = my_stop_cid_detect,
 	.handle_notify_message = my_handle_notify_message,
+	.increase_ss_count = my_increase_ss_count,
+	.decrease_ss_count = my_decrease_ss_count,
 };
 
 struct dahdi_pvt *round_robin[32];
@@ -15736,8 +15753,8 @@
 			if (p->owner)
 				ioctl(p->subs[SUB_REAL].dfd, DAHDI_HOOK, &x); /* important to create an event for dahdi_wait_event to register so that all analog_ss_threads terminate */
 			}
-			ast_cond_wait(&ss_thread_complete, &ss_thread_lock);
-		}
+		ast_cond_wait(&ss_thread_complete, &ss_thread_lock);
+	}
 
 	/* ensure any created channels before monitor threads were stopped are hungup */
 	dahdi_softhangup_all();

Modified: team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.c?view=diff&rev=196273&r1=196272&r2=196273
==============================================================================
--- team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.c (original)
+++ team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.c Fri May 22 11:54:11 2009
@@ -70,7 +70,6 @@
 	/* "smdi" is intentionally not supported here, as there is a much better
 	 * way to do this in the dialplan now. */
 };
-
 
 enum analog_sigtype analog_str_to_sigtype(const char *name)
 {
@@ -1218,6 +1217,24 @@
 		return -1;
 }
 
+static int analog_increase_ss_count(struct analog_pvt *p)
+{
+	if (p->calls->increase_ss_count) {
+		p->calls->increase_ss_count();
+		return 0;
+	} else
+		return -1;
+}
+
+static int analog_decrease_ss_count(struct analog_pvt *p)
+{
+	if (p->calls->decrease_ss_count) {
+		p->calls->decrease_ss_count();
+		return 0;
+	} else
+		return -1;
+}
+
 #define ANALOG_NEED_MFDETECT(p) (((p)->sig == ANALOG_SIG_FEATDMF) || ((p)->sig == ANALOG_SIG_FEATDMF_TA) || ((p)->sig == ANALOG_SIG_E911) || ((p)->sig == ANALOG_SIG_FGC_CAMA) || ((p)->sig == ANALOG_SIG_FGC_CAMAMF) || ((p)->sig == ANALOG_SIG_FEATB)) 
 
 static void *__analog_ss_thread(void *data)
@@ -1250,6 +1267,8 @@
 	int res;
 	int index;
 
+	analog_increase_ss_count(p);
+
 	ast_log(LOG_DEBUG, "%s %d\n", __FUNCTION__, p->channel);
 
 	/* in the bizarre case where the channel has become a zombie before we
@@ -1258,7 +1277,7 @@
 	if (!p) {
 		ast_log(LOG_WARNING, "Channel became a zombie before simple switch could be started (%s)\n", chan->name);
 		ast_hangup(chan);
-		return NULL;
+		goto quit;
 	}
 
 	if (option_verbose > 2) 
@@ -1267,7 +1286,7 @@
 	if (index < 0) {
 		ast_log(LOG_WARNING, "Huh?\n");
 		ast_hangup(chan);
-		return NULL;
+		goto quit;
 	}
 	analog_dsp_reset_and_flush_digits(p);
 	switch (p->sig) {
@@ -1283,7 +1302,7 @@
 	case ANALOG_SIG_SF_FEATB:
 	case ANALOG_SIG_SFWINK:
 		if (analog_wink(p, index))	
-			return NULL;
+			goto quit;
 		/* Fall through */
 	case ANALOG_SIG_EM:
 	case ANALOG_SIG_EM_E1:
@@ -1321,7 +1340,7 @@
 				res = analog_my_getsigstr(chan, dtmfbuf + 1, "#", 3000);
 				if (res < 1)
 					analog_dsp_reset_and_flush_digits(p);
-				if (analog_wink(p, index)) return NULL;
+				if (analog_wink(p, index)) goto quit;
 				dtmfbuf[0] = 0;
 				/* Wait for the first digit (up to 5 seconds). */
 				res = ast_waitfordigit(chan, 5000);
@@ -1336,7 +1355,7 @@
 				/* if international caca, do it again to get real ANO */
 				if ((p->sig == ANALOG_SIG_FEATDMF) && (dtmfbuf[1] != '0') && (strlen(dtmfbuf) != 14))
 				{
-					if (analog_wink(p, index)) return NULL;
+					if (analog_wink(p, index)) goto quit;
 					dtmfbuf[0] = 0;
 					/* Wait for the first digit (up to 5 seconds). */
 					res = ast_waitfordigit(chan, 5000);
@@ -1386,7 +1405,7 @@
 					if (res < 0) {
 						ast_debug(1, "waitfordigit returned < 0...\n");
 						ast_hangup(chan);
-						return NULL;
+						goto quit;
 					} else if (res) {
 						dtmfbuf[len++] = res;
 						dtmfbuf[len] = '\0';
@@ -1400,11 +1419,11 @@
 		if (res == -1) {
 			ast_log(LOG_WARNING, "getdtmf on channel %d: %s\n", p->channel, strerror(errno));
 			ast_hangup(chan);
-			return NULL;
+			goto quit;
 		} else if (res < 0) {
 			ast_debug(1, "Got hung up before digits finished\n");
 			ast_hangup(chan);
-			return NULL;
+			goto quit;
 		}
 
 		if (p->sig == ANALOG_SIG_FGC_CAMA) {
@@ -1412,7 +1431,7 @@
 
 			if (ast_safe_sleep(chan,1000) == -1) {
 	                        ast_hangup(chan);
-	                        return NULL;
+	                        goto quit;
 			}
 			analog_off_hook(p);
 			analog_dsp_set_digitmode(p, ANALOG_DIGITMODE_MF);
@@ -1501,7 +1520,7 @@
 			/* some switches require a minimum guard time between
 			the last FGD wink and something that answers
 			immediately. This ensures it */
-			if (ast_safe_sleep(chan,100)) return NULL;
+			if (ast_safe_sleep(chan,100)) goto quit;
 		}
 		analog_set_echocanceller(p, 1);
 
@@ -1515,7 +1534,7 @@
 				ast_log(LOG_WARNING, "PBX exited non-zero\n");
 				res = analog_play_tone(p, index, ANALOG_TONE_CONGESTION);
 			}
-			return NULL;
+			goto quit;
 		} else {
 			if (option_verbose > 2)
 				ast_verbose(VERBOSE_PREFIX_2 "Unknown extension '%s' in context '%s' requested\n", exten, chan->context);
@@ -1530,7 +1549,7 @@
 				ast_waitstream(chan, "");
 			res = analog_play_tone(p, index, ANALOG_TONE_CONGESTION);
 			ast_hangup(chan);
-			return NULL;
+			goto quit;
 		}
 		break;
 	case ANALOG_SIG_FXOLS:
@@ -1554,7 +1573,7 @@
 				ast_debug(1, "waitfordigit returned < 0...\n");
 				res = analog_play_tone(p, index, -1);
 				ast_hangup(chan);
-				return NULL;
+				goto quit;
 			} else if (res)  {
 				exten[len++]=res;
 				exten[len] = '\0';
@@ -1600,7 +1619,7 @@
 							ast_log(LOG_WARNING, "PBX exited non-zero\n");
 							res = analog_play_tone(p, index, ANALOG_TONE_CONGESTION);
 						}
-						return NULL;
+						goto quit;
 					}
 				} else {
 					/* It's a match, but they just typed a digit, and there is an ambiguous match,
@@ -1612,7 +1631,7 @@
 				res = analog_play_tone(p, index, ANALOG_TONE_CONGESTION);
 				analog_wait_event(p);
 				ast_hangup(chan);
-				return NULL;
+				goto quit;
 			} else if (p->callwaiting && !strcmp(exten, "*70")) {
 				if (option_verbose > 2) 
 					ast_verbose(VERBOSE_PREFIX_3 "Disabling call waiting on %s\n", chan->name);
@@ -1648,11 +1667,11 @@
 						analog_wait_event(p);
 					}
 					ast_hangup(chan);
-					return NULL;
+					goto quit;
 				} else {
 					ast_log(LOG_WARNING, "Huh?  Got *8# on call not on real\n");
 					ast_hangup(chan);
-					return NULL;
+					goto quit;
 				}
 				
 			} else if (!p->hidecallerid && !strcmp(exten, "*67")) {
@@ -1787,7 +1806,7 @@
 					if (ast_bridged_channel(p->subs[ANALOG_SUB_REAL].owner))
 						ast_queue_control(p->subs[ANALOG_SUB_REAL].owner, AST_CONTROL_UNHOLD);
 					ast_hangup(chan);
-					return NULL;
+					goto quit;
 				} else {
 					analog_play_tone(p, index, ANALOG_TONE_CONGESTION);
 					analog_wait_event(p);
@@ -1796,7 +1815,7 @@
 					analog_unalloc_sub(p, ANALOG_SUB_THREEWAY);
 					p->owner = p->subs[ANALOG_SUB_REAL].owner;
 					ast_hangup(chan);
-					return NULL;
+					goto quit;
 				}					
 #endif
 			} else if (!ast_canmatch_extension(chan, chan->context, exten, 1, chan->cid.cid_num) &&
@@ -1835,7 +1854,7 @@
 						ast_log(LOG_WARNING, "DTMFCID timed out waiting for ring. "
 							"Exiting simple switch\n");
 						ast_hangup(chan);
-						return NULL;
+						goto quit;
 					} 
 					f = ast_read(chan);
 					if (!f)
@@ -1883,7 +1902,7 @@
 							ast_log(LOG_WARNING, "I/O MUX failed: %s\n", strerror(errno));
 							callerid_free(cs);
 							ast_hangup(chan);
-							return NULL;
+							goto quit;
 						}
 						if (i & DAHDI_IOMUX_SIGEVENT) {
 							res = dahdi_get_event(p->subs[index].dfd);
@@ -1907,7 +1926,7 @@
 									ast_log(LOG_WARNING, "read returned error: %s\n", strerror(errno));
 									callerid_free(cs);
 									ast_hangup(chan);
-									return NULL;
+									goto quit;
 								}
 								break;
 							}
@@ -1950,12 +1969,12 @@
 							ast_log(LOG_WARNING, "CID timed out waiting for ring. "
 								"Exiting simple switch\n");
 							ast_hangup(chan);
-							return NULL;
+							goto quit;
 						} 
 						if (!(f = ast_read(chan))) {
 							ast_log(LOG_WARNING, "Hangup received waiting for ring. Exiting simple switch\n");
 							ast_hangup(chan);
-							return NULL;
+							goto quit;
 						}
 						ast_frfree(f);
 						if (chan->_state == AST_STATE_RING ||
@@ -1978,7 +1997,7 @@
 					"restarted by the actual ring.\n", 
 					chan->name);
 				ast_hangup(chan);
-				return NULL;
+				goto quit;
 			}
 		} else if (p->use_callerid && p->cid_start == ANALOG_CID_START_RING) {
 			int timeout = 10000;  /* Ten seconds */
@@ -2001,7 +2020,7 @@
 							ast_debug(1, "Hanging up due to polarity reversal on channel %d while detecting callerid\n", p->channel);
 							p->polarity = POLARITY_IDLE;
 							ast_hangup(chan);
-							return NULL;
+							goto quit;
 						} else if (ev != ANALOG_EVENT_NONE) {
 							break;
 						}
@@ -2049,7 +2068,7 @@
 						ast_log(LOG_WARNING, "I/O MUX failed: %s\n", strerror(errno));
 						callerid_free(cs);
 						ast_hangup(chan);
-						return NULL;
+						goto quit;
 					}
 					if (i & DAHDI_IOMUX_SIGEVENT) {
 						res = dahdi_get_event(p->subs[index].dfd);
@@ -2060,7 +2079,7 @@
 							p->polarity = POLARITY_IDLE;
 							callerid_free(cs);
 							ast_hangup(chan);
-							return NULL;
+							goto quit;
 						}
 						res = 0;
 						/* Let us detect callerid when the telco uses distinctive ring */
@@ -2080,7 +2099,7 @@
 								ast_log(LOG_WARNING, "read returned error: %s\n", strerror(errno));
 								callerid_free(cs);
 								ast_hangup(chan);
-								return NULL;
+								goto quit;
 							}
 							break;
 						}
@@ -2141,7 +2160,7 @@
 			ast_hangup(chan);
 			ast_log(LOG_WARNING, "PBX exited non-zero\n");
 		}
-		return NULL;
+		goto quit;
 	default:
 		ast_log(LOG_WARNING, "Don't know how to handle simple switch with signalling %s on channel %d\n", analog_sigtype_to_str(p->sig), p->channel);
 		res = analog_play_tone(p, index, ANALOG_TONE_CONGESTION);
@@ -2152,6 +2171,8 @@
 	if (res < 0)
 			ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", p->channel);
 	ast_hangup(chan);
+quit:
+	analog_decrease_ss_count(p);
 	return NULL;
 }
 

Modified: team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.h
URL: http://svn.asterisk.org/svn-view/asterisk/team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.h?view=diff&rev=196273&r1=196272&r2=196273
==============================================================================
--- team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.h (original)
+++ team/jpeeler/asterisk-sigwork-trunk/channels/sig_analog.h Fri May 22 11:54:11 2009
@@ -165,6 +165,9 @@
 	int (* const check_for_conference)(void *pvt);
 	void (* const handle_notify_message)(struct ast_channel *chan, void *pvt, int cid_flags, int neon_mwievent);
 
+	/* callbacks for increasing and decreasing ss_thread_count, will handle locking and condition signal */
+	void (* const increase_ss_count)(void);
+	void (* const decrease_ss_count)(void);
 };
 
 




More information about the svn-commits mailing list