[asterisk-commits] branch oej/siptransfer r19511 - in /team/oej/siptransfer: ./ apps/ channels/ ...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed Apr 12 12:53:12 MST 2006


Author: oej
Date: Wed Apr 12 14:52:47 2006
New Revision: 19511

URL: http://svn.digium.com/view/asterisk?rev=19511&view=rev
Log:
Reset automerge

Modified:
    team/oej/siptransfer/   (props changed)
    team/oej/siptransfer/Makefile
    team/oej/siptransfer/UPGRADE.txt
    team/oej/siptransfer/acl.c
    team/oej/siptransfer/apps/app_adsiprog.c
    team/oej/siptransfer/apps/app_alarmreceiver.c
    team/oej/siptransfer/apps/app_amd.c
    team/oej/siptransfer/apps/app_authenticate.c
    team/oej/siptransfer/apps/app_chanisavail.c
    team/oej/siptransfer/apps/app_channelredirect.c
    team/oej/siptransfer/apps/app_controlplayback.c
    team/oej/siptransfer/apps/app_db.c
    team/oej/siptransfer/apps/app_dial.c
    team/oej/siptransfer/apps/app_directory.c
    team/oej/siptransfer/apps/app_page.c
    team/oej/siptransfer/apps/app_voicemail.c
    team/oej/siptransfer/asterisk.c
    team/oej/siptransfer/channel.c
    team/oej/siptransfer/channels/chan_iax2.c
    team/oej/siptransfer/channels/chan_sip.c
    team/oej/siptransfer/channels/chan_skinny.c
    team/oej/siptransfer/channels/misdn/isdn_lib.c
    team/oej/siptransfer/configs/iax.conf.sample
    team/oej/siptransfer/doc/00README.1st
    team/oej/siptransfer/include/asterisk.h
    team/oej/siptransfer/include/asterisk/linkedlists.h
    team/oej/siptransfer/include/asterisk/lock.h
    team/oej/siptransfer/include/asterisk/module.h
    team/oej/siptransfer/loader.c
    team/oej/siptransfer/manager.c
    team/oej/siptransfer/pbx/pbx_config.c
    team/oej/siptransfer/res/res_agi.c
    team/oej/siptransfer/res/res_clioriginate.c
    team/oej/siptransfer/res/res_config_odbc.c
    team/oej/siptransfer/res/res_config_pgsql.c
    team/oej/siptransfer/res/res_convert.c
    team/oej/siptransfer/res/res_crypto.c
    team/oej/siptransfer/translate.c

Propchange: team/oej/siptransfer/
------------------------------------------------------------------------------
    automerge = http://edvina.net/training/

Propchange: team/oej/siptransfer/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.

Propchange: team/oej/siptransfer/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Wed Apr 12 14:52:47 2006
@@ -1,1 +1,1 @@
-/trunk:1-19122
+/trunk:1-19510

Modified: team/oej/siptransfer/Makefile
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/Makefile?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/Makefile (original)
+++ team/oej/siptransfer/Makefile Wed Apr 12 14:52:47 2006
@@ -674,7 +674,6 @@
 	if [ -n "$(OLDHEADERS)" ]; then \
 		rm -f $(addprefix $(DESTDIR)$(ASTHEADERDIR)/,$(OLDHEADERS)) ;\
 	fi
-	rm -f $(DESTDIR)$(ASTVARLIBDIR)/sounds/voicemail
 	mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds
 	mkdir -p $(DESTDIR)$(ASTLOGDIR)/cdr-csv
 	mkdir -p $(DESTDIR)$(ASTLOGDIR)/cdr-custom
@@ -693,7 +692,6 @@
 	else \
 		echo "You need to do cvs update -d not just cvs update" ; \
 	fi 
-	( cd $(DESTDIR)$(ASTVARLIBDIR)/sounds  ; ln -s $(ASTSPOOLDIR)/voicemail . )
 	if [ -f mpg123-0.59r/mpg123 ]; then $(MAKE) -C mpg123-0.59r install; fi
 	@echo " +---- Asterisk Installation Complete -------+"  
 	@echo " +                                           +"

Modified: team/oej/siptransfer/UPGRADE.txt
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/UPGRADE.txt?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/UPGRADE.txt (original)
+++ team/oej/siptransfer/UPGRADE.txt Wed Apr 12 14:52:47 2006
@@ -35,6 +35,15 @@
   using indication tones, so typing in skip would give you unexpected results.
 
 * OSPAuth is added to authenticate OSP tokens in in_bound call setup messages.
+
+Manager:
+
+* After executing the 'status' manager action, the "Status" manager events
+  included the header "CallerID:" which was actually only the CallerID number,
+  and not the full CallerID string.  This header has been renamed to
+  "CallerIDNum".  For compatibility purposes, the CallerID parameter will remain
+  until after the release of 1.4, when it will be removed.  Please use the time
+  during the 1.4 release to make this transition.
 
 Variables:
 

Modified: team/oej/siptransfer/acl.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/acl.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/acl.c (original)
+++ team/oej/siptransfer/acl.c Wed Apr 12 14:52:47 2006
@@ -70,10 +70,6 @@
 #include "asterisk/lock.h"
 #include "asterisk/srv.h"
 #include "asterisk/compat.h"
-
-#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)
-AST_MUTEX_DEFINE_STATIC(routeseq_lock);
-#endif
 
 struct ast_ha {
 	/* Host access rule */

Modified: team/oej/siptransfer/apps/app_adsiprog.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_adsiprog.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_adsiprog.c (original)
+++ team/oej/siptransfer/apps/app_adsiprog.c Wed Apr 12 14:52:47 2006
@@ -48,8 +48,6 @@
 #include "asterisk/options.h"
 #include "asterisk/utils.h"
 #include "asterisk/lock.h"
-
-static char *tdesc = "Asterisk ADSI Programming Application";
 
 static char *app = "ADSIProg";
 
@@ -1588,7 +1586,7 @@
 
 const char *description(void)
 {
-	return tdesc;
+	return "Asterisk ADSI Programming Application";
 }
 
 int usecount(void)
@@ -1598,7 +1596,7 @@
 	return res;
 }
 
-const char *key()
+const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }

Modified: team/oej/siptransfer/apps/app_alarmreceiver.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_alarmreceiver.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_alarmreceiver.c (original)
+++ team/oej/siptransfer/apps/app_alarmreceiver.c Wed Apr 12 14:52:47 2006
@@ -67,8 +67,6 @@
 };
 
 typedef struct event_node event_node_t;
-
-static char *tdesc = "Alarm Receiver for Asterisk";
 
 static char *app = "AlarmReceiver";
 
@@ -839,7 +837,7 @@
 
 const char *description(void)
 {
-	return tdesc;
+	return "Alarm Receiver for Asterisk";
 }
 
 int usecount(void)
@@ -849,7 +847,7 @@
 	return res;
 }
 
-const char *key()
+const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }

Modified: team/oej/siptransfer/apps/app_amd.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_amd.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_amd.c (original)
+++ team/oej/siptransfer/apps/app_amd.c Wed Apr 12 14:52:47 2006
@@ -35,7 +35,6 @@
 #include "asterisk/app.h"
 
 
-static char *tdesc = "Answering Machine Detection Application";
 static char *app = "AMD";
 static char *synopsis = "Attempts to detect answering machines";
 static char *descrip =
@@ -413,7 +412,7 @@
 
 const char *description(void)
 {
-	return tdesc;
+	return "Answering Machine Detection Application";
 }
 
 int usecount(void)
@@ -423,7 +422,7 @@
 	return res;
 }
 
-const char *key()
+const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }

Modified: team/oej/siptransfer/apps/app_authenticate.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_authenticate.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_authenticate.c (original)
+++ team/oej/siptransfer/apps/app_authenticate.c Wed Apr 12 14:52:47 2006
@@ -62,7 +62,6 @@
 	AST_APP_OPTION('r', OPT_REMOVE),
 });
 
-static char *tdesc = "Authentication Application";
 
 static char *app = "Authenticate";
 
@@ -254,7 +253,7 @@
 
 const char *description(void)
 {
-	return tdesc;
+	return "Authentication Application";
 }
 
 int usecount(void)
@@ -264,7 +263,7 @@
 	return res;
 }
 
-const char *key()
+const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }

Modified: team/oej/siptransfer/apps/app_chanisavail.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_chanisavail.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_chanisavail.c (original)
+++ team/oej/siptransfer/apps/app_chanisavail.c Wed Apr 12 14:52:47 2006
@@ -47,8 +47,6 @@
 #include "asterisk/app.h"
 #include "asterisk/devicestate.h"
 #include "asterisk/options.h"
-
-static char *tdesc = "Check channel availability";
 
 static char *app = "ChanIsAvail";
 
@@ -175,7 +173,7 @@
 
 const char *description(void)
 {
-	return tdesc;
+	return "Check channel availability";
 }
 
 int usecount(void)
@@ -185,7 +183,7 @@
 	return res;
 }
 
-const char *key()
+const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }

Modified: team/oej/siptransfer/apps/app_channelredirect.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_channelredirect.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_channelredirect.c (original)
+++ team/oej/siptransfer/apps/app_channelredirect.c Wed Apr 12 14:52:47 2006
@@ -41,7 +41,6 @@
 #include "asterisk/app.h"
 #include "asterisk/features.h"
 
-static char *tdesc = "Channel Redirect";
 static char *app = "ChannelRedirect";
 static char *synopsis = "Redirects given channel to a dialplan target.";
 static char *descrip = 
@@ -139,7 +138,7 @@
 
 const char *description(void)
 {
-	return tdesc;
+	return "Channel Redirect";
 }
 
 int usecount(void)
@@ -151,7 +150,7 @@
 	return res;
 }
 
-const char *key()
+const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }

Modified: team/oej/siptransfer/apps/app_controlplayback.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_controlplayback.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_controlplayback.c (original)
+++ team/oej/siptransfer/apps/app_controlplayback.c Wed Apr 12 14:52:47 2006
@@ -43,8 +43,6 @@
 #include "asterisk/translate.h"
 #include "asterisk/utils.h"
 #include "asterisk/options.h"
-
-static const char *tdesc = "Control Playback Application";
 
 static const char *app = "ControlPlayback";
 
@@ -174,7 +172,7 @@
 
 const char *description(void)
 {
-	return (char *) tdesc;
+	return "Control Playback Application";
 }
 
 int usecount(void)
@@ -185,7 +183,7 @@
 	return res;
 }
 
-const char *key()
+const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }

Modified: team/oej/siptransfer/apps/app_db.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_db.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_db.c (original)
+++ team/oej/siptransfer/apps/app_db.c Wed Apr 12 14:52:47 2006
@@ -47,8 +47,6 @@
 #include "asterisk/astdb.h"
 #include "asterisk/lock.h"
 #include "asterisk/options.h"
-
-static char *tdesc = "Database Access Functions";
 
 static char *d_descrip =
 "  DBdel(family/key): This applicaiton will delete a key from the Asterisk\n"
@@ -169,7 +167,7 @@
 
 const char *description(void)
 {
-	return tdesc;
+	return "Database Access Functions";
 }
 
 int usecount(void)
@@ -179,7 +177,7 @@
 	return res;
 }
 
-const char *key()
+const char *key(void)
 {
 	return ASTERISK_GPL_KEY;
 }

Modified: team/oej/siptransfer/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_dial.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_dial.c (original)
+++ team/oej/siptransfer/apps/app_dial.c Wed Apr 12 14:52:47 2006
@@ -60,8 +60,6 @@
 #include "asterisk/manager.h"
 #include "asterisk/privacy.h"
 #include "asterisk/stringfields.h"
-
-static char *tdesc = "Dialing Application";
 
 static char *app = "Dial";
 
@@ -308,6 +306,8 @@
 		if (chan->cdr) \
 			ast_cdr_failed(chan->cdr); \
 		numnochan++; \
+		break; \
+	case AST_CAUSE_NORMAL_CLEARING: \
 		break; \
 	default: \
 		numnochan++; \
@@ -734,12 +734,12 @@
 
 static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags *peerflags)
 {
-	int res=-1;
+	int res = -1;
 	struct localuser *u;
 	char *tech, *number, *rest, *cur;
 	char privcid[256];
 	char privintro[1024];
-	struct dial_localuser *outgoing=NULL, *tmp;
+	struct dial_localuser *outgoing = NULL, *tmp;
 	struct ast_channel *peer;
 	int to;
 	int numbusy = 0;
@@ -750,20 +750,20 @@
 	char cidname[AST_MAX_EXTENSION];
 	char toast[80];
 	char *l;
-	int privdb_val=0;
-	unsigned int calldurationlimit=0;
+	int privdb_val = 0;
+	unsigned int calldurationlimit = 0;
 	struct ast_bridge_config config;
 	long timelimit = 0;
 	long play_warning = 0;
-	long warning_freq=0;
-	const char *warning_sound=NULL;
-	const char *end_sound=NULL;
-	const char *start_sound=NULL;
-	char *dtmfcalled=NULL, *dtmfcalling=NULL;
+	long warning_freq = 0;
+	const char *warning_sound = NULL;
+	const char *end_sound = NULL;
+	const char *start_sound = NULL;
+	char *dtmfcalled = NULL, *dtmfcalling = NULL;
 	const char *var;
 	char status[256];
-	int play_to_caller=0,play_to_callee=0;
-	int sentringing=0, moh=0;
+	int play_to_caller = 0, play_to_callee = 0;
+	int sentringing = 0, moh = 0;
 	const char *outbound_group = NULL;
 	const char *macro_result = NULL;
 	char *macro_transfer_dest = NULL;
@@ -810,8 +810,13 @@
 
 	if (ast_test_flag(&opts, OPT_DURATION_STOP) && !ast_strlen_zero(opt_args[OPT_ARG_DURATION_STOP])) {
 		calldurationlimit = atoi(opt_args[OPT_ARG_DURATION_STOP]);
+		if (!calldurationlimit) {
+			ast_log(LOG_WARNING, "Dial does not accept S(%s), hanging up.\n", opt_args[OPT_ARG_DURATION_STOP]);
+			LOCAL_USER_REMOVE(u);
+			return -1;
+		}
 		if (option_verbose > 2)
-			ast_verbose(VERBOSE_PREFIX_3 "Setting call duration limit to %d seconds.\n", calldurationlimit);			
+			ast_verbose(VERBOSE_PREFIX_3 "Setting call duration limit to %d seconds.\n", calldurationlimit);
 	}
 
 	if (ast_test_flag(&opts, OPT_SENDDTMF) && !ast_strlen_zero(opt_args[OPT_ARG_SENDDTMF])) {
@@ -835,8 +840,24 @@
 			warning_freq = atol(warnfreq_str);
 
 		if (!timelimit) {
-			timelimit = play_to_caller = play_to_callee = play_warning = warning_freq = 0;
-			warning_sound = NULL;
+			ast_log(LOG_WARNING, "Dial does not accept L(%s), hanging up.\n", limit_str);
+			LOCAL_USER_REMOVE(u);
+			return -1;
+		} else if (play_warning > timelimit) {
+			/* If the first warning is requested _after_ the entire call would end,
+			   and no warning frequency is requested, then turn off the warning. If
+			   a warning frequency is requested, reduce the 'first warning' time by
+			   that frequency until it falls within the call's total time limit.
+			*/
+
+			if (!warning_freq) {
+				play_warning = 0;
+			} else {
+				while (play_warning > timelimit)
+					play_warning -= warning_freq;
+				if (play_warning < 1)
+					play_warning = warning_freq = 0;
+			}
 		}
 
 		var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLER");
@@ -846,33 +867,35 @@
 		play_to_callee = var ? ast_true(var) : 0;
 		
 		if (!play_to_caller && !play_to_callee)
-			play_to_caller=1;
+			play_to_caller = 1;
 		
 		var = pbx_builtin_getvar_helper(chan,"LIMIT_WARNING_FILE");
-		warning_sound = var ? var : "timeleft";
+		warning_sound = (!ast_strlen_zero(var)) ? var : "timeleft";
 		
 		var = pbx_builtin_getvar_helper(chan,"LIMIT_TIMEOUT_FILE");
-		end_sound = var ? var : NULL;
+		end_sound = (!ast_strlen_zero(var)) ? var : NULL;
 		
 		var = pbx_builtin_getvar_helper(chan,"LIMIT_CONNECT_FILE");
-		start_sound = var ? var : NULL;
+		start_sound = (!ast_strlen_zero(var)) ? var : NULL;
 
 		/* undo effect of S(x) in case they are both used */
-		calldurationlimit = 0; 
-		/* more efficient do it like S(x) does since no advanced opts*/
-		if (!play_warning && !start_sound && !end_sound && timelimit) { 
-			calldurationlimit = timelimit/1000;
+		calldurationlimit = 0;
+		/* more efficient to do it like S(x) does since no advanced opts */
+		if (!play_warning && !start_sound && !end_sound && timelimit) {
+			calldurationlimit = timelimit / 1000;
+			if (option_verbose > 2)
+				ast_verbose(VERBOSE_PREFIX_3 "Setting call duration limit to %d seconds.\n", calldurationlimit);
 			timelimit = play_to_caller = play_to_callee = play_warning = warning_freq = 0;
 		} else if (option_verbose > 2) {
 			ast_verbose(VERBOSE_PREFIX_3 "Limit Data for this call:\n");
-			ast_verbose(VERBOSE_PREFIX_3 "- timelimit     = %ld\n", timelimit);
-			ast_verbose(VERBOSE_PREFIX_3 "- play_warning  = %ld\n", play_warning);
-			ast_verbose(VERBOSE_PREFIX_3 "- play_to_caller= %s\n", play_to_caller ? "yes" : "no");
-			ast_verbose(VERBOSE_PREFIX_3 "- play_to_callee= %s\n", play_to_callee ? "yes" : "no");
-			ast_verbose(VERBOSE_PREFIX_3 "- warning_freq  = %ld\n", warning_freq);
-			ast_verbose(VERBOSE_PREFIX_3 "- start_sound   = %s\n", start_sound ? start_sound : "UNDEF");
-			ast_verbose(VERBOSE_PREFIX_3 "- warning_sound = %s\n", warning_sound ? warning_sound : "UNDEF");
-			ast_verbose(VERBOSE_PREFIX_3 "- end_sound     = %s\n", end_sound ? end_sound : "UNDEF");
+			ast_verbose(VERBOSE_PREFIX_4 "timelimit      = %ld\n", timelimit);
+			ast_verbose(VERBOSE_PREFIX_4 "play_warning   = %ld\n", play_warning);
+			ast_verbose(VERBOSE_PREFIX_4 "play_to_caller = %s\n", play_to_caller ? "yes" : "no");
+			ast_verbose(VERBOSE_PREFIX_4 "play_to_callee = %s\n", play_to_callee ? "yes" : "no");
+			ast_verbose(VERBOSE_PREFIX_4 "warning_freq   = %ld\n", warning_freq);
+			ast_verbose(VERBOSE_PREFIX_4 "start_sound    = %s\n", start_sound);
+			ast_verbose(VERBOSE_PREFIX_4 "warning_sound  = %s\n", warning_sound);
+			ast_verbose(VERBOSE_PREFIX_4 "end_sound      = %s\n", end_sound);
 		}
 	}
 
@@ -1730,7 +1753,8 @@
 
 STATIC_MODULE const char *description(void)
 {
-	return tdesc;
+	return "Dialing Application";
+
 }
 
 STATIC_MODULE int usecount(void)

Modified: team/oej/siptransfer/apps/app_directory.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_directory.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_directory.c (original)
+++ team/oej/siptransfer/apps/app_directory.c Wed Apr 12 14:52:47 2006
@@ -65,8 +65,10 @@
 "                   extension that the user has selected, or when jumping to the\n"
 "                   'o' or 'a' extension.\n\n"
 "  Options:\n"
+"    e - In addition to the name, also read the extension number to the\n"
+"        caller before presenting dialing options.\n"
 "    f - Allow the caller to enter the first name of a user in the directory\n"
-"        instead of using the last name.\n"; 
+"        instead of using the last name.\n";
 
 /* For simplicity, I'm keeping the format compatible with the voicemail config,
    but i'm open to suggestions for isolating it */
@@ -152,7 +154,7 @@
  *           '1' for selected entry from directory
  *           '*' for skipped entry from directory
  */
-static int play_mailbox_owner(struct ast_channel *chan, char *context, char *dialcontext, char *ext, char *name) {
+static int play_mailbox_owner(struct ast_channel *chan, char *context, char *dialcontext, char *ext, char *name, int readext) {
 	int res = 0;
 	int loop = 3;
 	char fn[256];
@@ -172,15 +174,38 @@
 			res = ast_waitstream(chan, AST_DIGIT_ANY);
 		}
 		ast_stopstream(chan);
+		/* If Option 'e' was specified, also read the extension number with the name */
+		if (readext) {
+			res = ast_streamfile(chan, "vm-extension", chan->language);
+			if (!res) {
+				res = ast_waitstream(chan, AST_DIGIT_ANY);
+			}
+			res = ast_say_character_str(chan, ext, AST_DIGIT_ANY, chan->language);
+		}
 	} else if (ast_fileexists(fn2, NULL, chan->language) > 0) {
 		res = ast_streamfile(chan, fn2, chan->language);
 		if (!res) {
 			res = ast_waitstream(chan, AST_DIGIT_ANY);
 		}
 		ast_stopstream(chan);
+		/* If Option 'e' was specified, also read the extension number with the name */
+		if (readext) {
+			res = ast_streamfile(chan, "vm-extension", chan->language);
+			if (!res) {
+				res = ast_waitstream(chan, AST_DIGIT_ANY);
+			}
+			res = ast_say_character_str(chan, ext, AST_DIGIT_ANY, chan->language);
+		}
 	} else {
 		res = ast_say_character_str(chan, S_OR(name, ext),
 					AST_DIGIT_ANY, chan->language);
+		if (!ast_strlen_zero(name) && readext) {
+			res = ast_streamfile(chan, "vm-extension", chan->language);
+			if (!res) {
+				res = ast_waitstream(chan, AST_DIGIT_ANY);
+			}
+			res = ast_say_character_str(chan, ext, AST_DIGIT_ANY, chan->language);
+		}
 	}
 
 	while (loop) {
@@ -289,7 +314,7 @@
 	return cfg;
 }
 
-static int do_directory(struct ast_channel *chan, struct ast_config *cfg, char *context, char *dialcontext, char digit, int last)
+static int do_directory(struct ast_channel *chan, struct ast_config *cfg, char *context, char *dialcontext, char digit, int last, int readext)
 {
 	/* Read in the first three digits..  "digit" is the first digit, already read */
 	char ext[NUMDIGITS + 1];
@@ -368,7 +393,7 @@
 
 			if (v) {
 				/* We have a match -- play a greeting if they have it */
-				res = play_mailbox_owner(chan, context, dialcontext, v->name, name);
+				res = play_mailbox_owner(chan, context, dialcontext, v->name, name, readext);
 				switch (res) {
 					case -1:
 						/* user pressed '1' but extension does not exist, or
@@ -415,6 +440,7 @@
 	struct localuser *u;
 	struct ast_config *cfg;
 	int last = 1;
+	int readext = 0;
 	char *dirintro, *parse;
 	AST_DECLARE_APP_ARGS(args,
 		AST_APP_ARG(vmcontext);
@@ -439,6 +465,8 @@
 	if (args.options) {
 		if (strchr(args.options, 'f'))
 			last = 0;
+		if (strchr(args.options, 'e'))
+			readext = 1;
 	}
 
 	if (ast_strlen_zero(args.dialcontext))	
@@ -473,7 +501,7 @@
 		if (!res)
 			res = ast_waitfordigit(chan, 5000);
 		if (res > 0) {
-			res = do_directory(chan, cfg, args.vmcontext, args.dialcontext, res, last);
+			res = do_directory(chan, cfg, args.vmcontext, args.dialcontext, res, last, readext);
 			if (res > 0) {
 				res = ast_waitstream(chan, AST_DIGIT_ANY);
 				ast_stopstream(chan);

Modified: team/oej/siptransfer/apps/app_page.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_page.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_page.c (original)
+++ team/oej/siptransfer/apps/app_page.c Wed Apr 12 14:52:47 2006
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (c) 2004 - 2005 Digium, Inc.  All rights reserved.
+ * Copyright (c) 2004 - 2006 Digium, Inc.  All rights reserved.
  *
  * Mark Spencer <markster at digium.com>
  *
@@ -147,6 +147,7 @@
 	struct ast_app *app;
 	char *tmp;
 	int res=0;
+	char originator[AST_CHANNEL_NAME];
 
 	if (ast_strlen_zero(data)) {
 		ast_log(LOG_WARNING, "This application requires at least one argument (destination(s) to page)\n");
@@ -171,7 +172,16 @@
 		ast_app_parse_options(page_opts, &flags, NULL, options);
 
 	snprintf(meetmeopts, sizeof(meetmeopts), "%ud|%sqxdw", confid, ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "m");
+
+	ast_copy_string(originator, chan->name, sizeof(originator));
+	if ((tmp = strchr(originator, '-')))
+		*tmp = '\0';
+
 	while ((tech = strsep(&tmp, "&"))) {
+		/* don't call the originating device */
+		if (!strcasecmp(tech, originator))
+			continue;
+
 		if ((resource = strchr(tech, '/'))) {
 			*resource++ = '\0';
 			launch_page(chan, meetmeopts, tech, resource);
@@ -179,6 +189,7 @@
 			ast_log(LOG_WARNING, "Incomplete destination '%s' supplied.\n", tech);
 		}
 	}
+
 	if (!ast_test_flag(&flags, PAGE_QUIET)) {
 		res = ast_streamfile(chan, "beep", chan->language);
 		if (!res)

Modified: team/oej/siptransfer/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/apps/app_voicemail.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/apps/app_voicemail.c (original)
+++ team/oej/siptransfer/apps/app_voicemail.c Wed Apr 12 14:52:47 2006
@@ -1280,7 +1280,7 @@
 		len = fdlen; /* SQL_LEN_DATA_AT_EXEC(fdlen); */
 		SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(dir), 0, (void *)dir, 0, NULL);
 		SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(msgnums), 0, (void *)msgnums, 0, NULL);
-		SQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, fdlen, 0, (void *)fdm, fdlen, &len);
+		SQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, fdlen, 0, (void *)fdm, fdlen, &len);
 		SQLBindParameter(stmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(context), 0, (void *)context, 0, NULL);
 		SQLBindParameter(stmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(macrocontext), 0, (void *)macrocontext, 0, NULL);
 		SQLBindParameter(stmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(callerid), 0, (void *)callerid, 0, NULL);

Modified: team/oej/siptransfer/asterisk.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/asterisk.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/asterisk.c (original)
+++ team/oej/siptransfer/asterisk.c Wed Apr 12 14:52:47 2006
@@ -597,6 +597,8 @@
 					consoles[x].fd = s;
 					if (ast_pthread_create(&consoles[x].t, &attr, netconsole, &consoles[x])) {
 						ast_log(LOG_ERROR, "Unable to spawn thread to handle connection: %s\n", strerror(errno));
+						close(consoles[x].p[0]);
+						close(consoles[x].p[1]);
 						consoles[x].fd = -1;
 						fdprint(s, "Server failed to spawn thread\n");
 						close(s);

Modified: team/oej/siptransfer/channel.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/channel.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/channel.c (original)
+++ team/oej/siptransfer/channel.c Wed Apr 12 14:52:47 2006
@@ -1276,7 +1276,6 @@
 	struct ast_frame *translated_frame = NULL;
 	struct ast_channel_spy *spy;
 	struct ast_channel_spy_queue *queue;
-	struct ast_channel_spy_queue *other_queue;
 	struct channel_spy_trans *trans;
 	struct ast_frame *last;
 
@@ -1338,48 +1337,42 @@
 
 		if (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
 			if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) {
-				other_queue = (dir == SPY_WRITE) ? &spy->read_queue : &spy->write_queue;
-
-				if (other_queue->samples == 0) {
-					switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
-					case CHANSPY_TRIGGER_READ:
-						if (dir == SPY_WRITE) {
-							ast_set_flag(spy, CHANSPY_TRIGGER_WRITE);
-							ast_clear_flag(spy, CHANSPY_TRIGGER_READ);
-							if (option_debug)
-								ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to write-trigger mode\n",
-									spy->type, chan->name);
-						}
-						break;
-					case CHANSPY_TRIGGER_WRITE:
-						if (dir == SPY_READ) {
-							ast_set_flag(spy, CHANSPY_TRIGGER_READ);
-							ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
-							if (option_debug)
-								ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to read-trigger mode\n",
-									spy->type, chan->name);
-						}
-						break;
+				switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {
+				case CHANSPY_TRIGGER_READ:
+					if (dir == SPY_WRITE) {
+						ast_set_flag(spy, CHANSPY_TRIGGER_WRITE);
+						ast_clear_flag(spy, CHANSPY_TRIGGER_READ);
+						if (option_debug)
+							ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to write-trigger mode\n",
+								spy->type, chan->name);
 					}
-					if (option_debug)
-						ast_log(LOG_DEBUG, "Triggering queue flush for spy '%s' on '%s'\n",
-							spy->type, chan->name);
-					ast_set_flag(spy, CHANSPY_TRIGGER_FLUSH);
-					ast_cond_signal(&spy->trigger);
-					ast_mutex_unlock(&spy->lock);
-					continue;
+					break;
+				case CHANSPY_TRIGGER_WRITE:
+					if (dir == SPY_READ) {
+						ast_set_flag(spy, CHANSPY_TRIGGER_READ);
+						ast_clear_flag(spy, CHANSPY_TRIGGER_WRITE);
+						if (option_debug)
+							ast_log(LOG_DEBUG, "Switching spy '%s' on '%s' to read-trigger mode\n",
+								spy->type, chan->name);
+					}
+					break;
 				}
-			}
-
-			if (option_debug)
-				ast_log(LOG_DEBUG, "Spy '%s' on channel '%s' %s queue too long, dropping frames\n",
-					spy->type, chan->name, (dir == SPY_READ) ? "read" : "write");
-			while (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
-				struct ast_frame *drop = queue->head;
-
-				queue->samples -= drop->samples;
-				queue->head = drop->next;
-				ast_frfree(drop);
+				if (option_debug)
+					ast_log(LOG_DEBUG, "Triggering queue flush for spy '%s' on '%s'\n",
+						spy->type, chan->name);
+				ast_set_flag(spy, CHANSPY_TRIGGER_FLUSH);
+				ast_cond_signal(&spy->trigger);
+			} else {
+				if (option_debug)
+					ast_log(LOG_DEBUG, "Spy '%s' on channel '%s' %s queue too long, dropping frames\n",
+						spy->type, chan->name, (dir == SPY_READ) ? "read" : "write");
+				while (queue->samples > SPY_QUEUE_SAMPLE_LIMIT) {
+					struct ast_frame *drop = queue->head;
+					
+					queue->samples -= drop->samples;
+					queue->head = drop->next;
+					ast_frfree(drop);
+				}
 			}
 		} else {
 			switch (ast_test_flag(spy, CHANSPY_TRIGGER_MODE)) {

Modified: team/oej/siptransfer/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/oej/siptransfer/channels/chan_iax2.c?rev=19511&r1=19510&r2=19511&view=diff
==============================================================================
--- team/oej/siptransfer/channels/chan_iax2.c (original)
+++ team/oej/siptransfer/channels/chan_iax2.c Wed Apr 12 14:52:47 2006
@@ -92,6 +92,7 @@
 #include "asterisk/devicestate.h"
 #include "asterisk/netsock.h"
 #include "asterisk/stringfields.h"
+#include "asterisk/linkedlists.h"
 
 #include "iax2.h"
 #include "iax2-parser.h"
@@ -134,6 +135,7 @@
 #define CALLNO_TO_PTR(a) ((void *)(unsigned long)(a))
 
 #define DEFAULT_THREAD_COUNT 10
+#define DEFAULT_MAX_THREAD_COUNT 100
 #define DEFAULT_RETRY_TIME 1000
 #define MEMORY_SIZE 100
 #define DEFAULT_DROP 3
@@ -444,6 +446,8 @@
 static int min_jitter_buffer = MIN_JITTER_BUFFER;
 
 static int iaxthreadcount = DEFAULT_THREAD_COUNT;
+static int iaxmaxthreadcount = DEFAULT_MAX_THREAD_COUNT;
+static int iaxdynamicthreadcount = 0;
 
 struct iax_rr {
 	int jitter;
@@ -681,8 +685,12 @@
 #define IAX_IOSTATE_PROCESSING	2
 #define IAX_IOSTATE_SCHEDREADY	3
 
+#define IAX_TYPE_POOL    1
+#define IAX_TYPE_DYNAMIC 2
+
 struct iax2_thread {
-	ASTOBJ_COMPONENTS(struct iax2_thread);
+	AST_LIST_ENTRY(iax2_thread) list;
+	int type;
 	int iostate;
 #ifdef SCHED_MULTITHREADED
 	void (*schedfunc)(void *);
@@ -704,11 +712,12 @@
 	ast_cond_t cond;
 };
 
-struct iax2_thread_list {
-	ASTOBJ_CONTAINER_COMPONENTS(struct iax2_thread);
-};
-
-static struct iax2_thread_list idlelist, activelist;
+/* Thread lists */
+static AST_LIST_HEAD_STATIC(idle_list, iax2_thread);
+static AST_LIST_HEAD_STATIC(active_list, iax2_thread);
+static AST_LIST_HEAD_STATIC(dynamic_list, iax2_thread);
+
+static void *iax2_process_thread(void *data);
 
 static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
 {
@@ -831,19 +840,57 @@
 
 static struct iax2_thread *find_idle_thread(void)
 {
-	struct iax2_thread *thread;
-	thread = ASTOBJ_CONTAINER_UNLINK_START(&idlelist);
+	struct iax2_thread *thread = NULL;
+
+	/* Find free idle thread in the list, get a pointer to it, and remove it from the list */
+	AST_LIST_LOCK(&idle_list);
+	thread = AST_LIST_FIRST(&idle_list);
+	if (thread != NULL) {
+		AST_LIST_REMOVE(&idle_list, thread, list);
+	}
+	AST_LIST_UNLOCK(&idle_list);
+
+	/* If no idle thread is available from the regular list, try dynamic */
+	if (thread == NULL) {
+		AST_LIST_LOCK(&dynamic_list);
+		thread = AST_LIST_FIRST(&dynamic_list);
+		if (thread != NULL) {
+			AST_LIST_REMOVE(&dynamic_list, thread, list);
+		}
+		/* Make sure we absolutely have a thread... if not, try to make one if allowed */
+		if (thread == NULL && iaxmaxthreadcount > iaxdynamicthreadcount) {
+			/* We need to MAKE a thread! */
+			thread = ast_calloc(1, sizeof(*thread));
+			if (thread != NULL) {
+				thread->threadnum = iaxdynamicthreadcount;
+				thread->type = IAX_TYPE_DYNAMIC;
+				ast_mutex_init(&thread->lock);
+				ast_cond_init(&thread->cond, NULL);
+				if (ast_pthread_create(&thread->threadid, NULL, iax2_process_thread, thread)) {
+					free(thread);
+					thread = NULL;
+				} else {
+					/* All went well and the thread is up, so increment our count */
+					iaxdynamicthreadcount++;
+				}
+			}
+		}
+		AST_LIST_UNLOCK(&dynamic_list);
+	}
+
 	return thread;
 }
 
 #ifdef SCHED_MULTITHREADED
 static int __schedule_action(void (*func)(void *data), void *data, const char *funcname)
 {
-	struct iax2_thread *thread;
+	struct iax2_thread *thread = NULL;
 	static time_t lasterror;
 	static time_t t;
+
 	thread = find_idle_thread();
-	if (thread) {
+
+	if (thread != NULL) {
 		thread->schedfunc = func;
 		thread->scheddata = data;
 		thread->iostate = IAX_IOSTATE_SCHEDREADY;
@@ -857,6 +904,7 @@
 	if (t != lasterror) 
 		ast_log(LOG_NOTICE, "Out of idle IAX2 threads for scheduling!\n");
 	lasterror = t;
+
 	return -1;
 }
 #define schedule_action(func, data) __schedule_action(func, data, __PRETTY_FUNCTION__)
@@ -4419,42 +4467,60 @@
 
 static int iax2_show_threads(int fd, int argc, char *argv[])
 {
+	struct iax2_thread *thread = NULL;
 	time_t t;
-	int threadcount = 0;
+	int threadcount = 0, dynamiccount = 0;
+	char type;
+
 	if (argc != 3)
 		return RESULT_SHOWUSAGE;
 		
 	ast_cli(fd, "IAX2 Thread Information\n");
 	time(&t);
 	ast_cli(fd, "Idle Threads:\n");
+	AST_LIST_LOCK(&idle_list);
+	AST_LIST_TRAVERSE(&idle_list, thread, list) {
 #ifdef DEBUG_SCHED_MULTITHREAD
-	ASTOBJ_CONTAINER_TRAVERSE(&idlelist, 1, {
-		ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d, refcnt=%d, func ='%s'\n", 
-			iterator->threadnum, iterator->iostate, (int)(t - iterator->checktime), iterator->actions, iterator->refcount, iterator->curfunc);
+		ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d, func ='%s'\n", 
+			thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions, thread->curfunc);
+#else
+		ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d\n", 
+			thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions);
+#endif
 		threadcount++;
-	});
+	}
+	AST_LIST_UNLOCK(&idle_list);
+	ast_cli(fd, "Active Threads:\n");
+	AST_LIST_LOCK(&active_list);
+	AST_LIST_TRAVERSE(&active_list, thread, list) {
+		if (thread->type == IAX_TYPE_DYNAMIC)
+			type = 'D';
+		else
+			type = 'P';
+#ifdef DEBUG_SCHED_MULTITHREAD
+		ast_cli(fd, "Thread %c%d: state=%d, update=%d, actions=%d, func ='%s'\n", 
+			type, thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions, thread->curfunc);
 #else
-	ASTOBJ_CONTAINER_TRAVERSE(&idlelist, 1, {
-		ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d, refcnt=%d\n", 
-			iterator->threadnum, iterator->iostate, (int)(t - iterator->checktime), iterator->actions, iterator->refcount);
+		ast_cli(fd, "Thread %c%d: state=%d, update=%d, actions=%d\n", 
+			type, thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions);
+#endif
 		threadcount++;
-	});
+	}
+	AST_LIST_UNLOCK(&active_list);
+	ast_cli(fd, "Dynamic Threads:\n");
+        AST_LIST_LOCK(&dynamic_list);
+        AST_LIST_TRAVERSE(&dynamic_list, thread, list) {
+#ifdef DEBUG_SCHED_MULTITHREAD
+                ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d, func ='%s'\n",
+                        thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions, thread->curfunc);
+#else
+                ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d\n",
+                        thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions);
 #endif
-	ast_cli(fd, "Active Threads:\n");
-#ifdef DEBUG_SCHED_MULTITHREAD
-	ASTOBJ_CONTAINER_TRAVERSE(&activelist, 1, {
-		ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d, refcnt=%d, func ='%s'\n", 
-			iterator->threadnum, iterator->iostate, (int)(t - iterator->checktime), iterator->actions, iterator->refcount, iterator->curfunc);
-		threadcount++;
-	});
-#else
-	ASTOBJ_CONTAINER_TRAVERSE(&activelist, 1, {
-		ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d, refcnt=%d\n", 
-			iterator->threadnum, iterator->iostate, (int)(t - iterator->checktime), iterator->actions, iterator->refcount);
-		threadcount++;
-	});
-#endif
-	ast_cli(fd, "%d of %d threads accounted for\n", threadcount, iaxthreadcount);
+		dynamiccount++;
+        }
+        AST_LIST_UNLOCK(&dynamic_list);
+	ast_cli(fd, "%d of %d threads accounted for with %d dynamic threads\n", threadcount, iaxthreadcount, dynamiccount);
 	return RESULT_SUCCESS;
 }
 
@@ -6512,11 +6578,15 @@
 			if (errno != ECONNREFUSED)
 				ast_log(LOG_WARNING, "Error: %s\n", strerror(errno));
 			handle_error();
-			ASTOBJ_CONTAINER_LINK_END(&idlelist, thread);
+			AST_LIST_LOCK(&idle_list);
+			AST_LIST_INSERT_TAIL(&idle_list, thread, list);
+			AST_LIST_UNLOCK(&idle_list);
 			return 1;
 		}
 		if (test_losspct && ((100.0 * ast_random() / (RAND_MAX + 1.0)) < test_losspct)) { /* simulate random loss condition */
-			ASTOBJ_CONTAINER_LINK_END(&idlelist, thread); 
+			AST_LIST_LOCK(&idle_list);
+			AST_LIST_INSERT_TAIL(&idle_list, thread, list);
+			AST_LIST_UNLOCK(&idle_list);
 			return 1;
 		}
 		/* Mark as ready and send on its way */
@@ -7891,34 +7961,44 @@
 	return 1;
 }
 
-static void destroy_helper(struct iax2_thread *thread)
-{
-	ast_log(LOG_DEBUG, "Destroying helper %d!\n", thread->threadnum);
-	ast_mutex_destroy(&thread->lock);
-	ast_cond_destroy(&thread->cond);
-	free(thread);
-}
-
 static void *iax2_process_thread(void *data)
 {
-	struct iax2_thread *thread_copy, *thread = data;
+	struct iax2_thread *thread = data;
+	struct timeval tv;
+	struct timespec ts;
 
 	for(;;) {
 		/* Wait for something to signal us to be awake */
 		ast_mutex_lock(&thread->lock);
-		ast_cond_wait(&thread->cond, &thread->lock);
+		if (thread->type == IAX_TYPE_DYNAMIC) {
+			/* Wait to be signalled or time out */
+			tv = ast_tvadd(ast_tvnow(), ast_samp2tv(30000, 1000));
+			ts.tv_sec = tv.tv_sec;
+			ts.tv_nsec = tv.tv_usec * 1000;
+			if (ast_cond_timedwait(&thread->cond, &thread->lock, &ts) == ETIMEDOUT) {
+				ast_mutex_unlock(&thread->lock);
+				AST_LIST_LOCK(&dynamic_list);
+				AST_LIST_REMOVE(&dynamic_list, thread, list);
+				iaxdynamicthreadcount--;
+				AST_LIST_UNLOCK(&dynamic_list);
+				break;
+			}
+		} else {
+			ast_cond_wait(&thread->cond, &thread->lock);
+		}
 		ast_mutex_unlock(&thread->lock);
-		/* Unlink from idlelist / activelist if there*/
-		ASTOBJ_CONTAINER_UNLINK(&idlelist, thread);
-		ASTOBJ_CONTAINER_UNLINK(&activelist, thread);
-		/* If instructed to halt, stop now */
+
+		/* If we were signalled, then we are already out of both lists or we are shutting down */
 		if (thread->halt) {
-			ast_log(LOG_DEBUG, "Halting, refcount = %d\n", thread->refcount);
-			ASTOBJ_UNREF(thread, destroy_helper);
 			break;
 		}
-		/* Remove our reference */
-		ASTOBJ_CONTAINER_LINK_END(&activelist, thread);
+
+		/* Add ourselves to the active list now */
+		AST_LIST_LOCK(&active_list);
+		AST_LIST_INSERT_HEAD(&active_list, thread, list);
+		AST_LIST_UNLOCK(&active_list);
+

[... 1391 lines stripped ...]


More information about the asterisk-commits mailing list