[Asterisk-cvs] asterisk/pbx pbx_spool.c,1.5.2.1,1.5.2.2

markster at lists.digium.com markster at lists.digium.com
Sat Mar 20 16:17:51 CST 2004


Update of /usr/cvsroot/asterisk/pbx
In directory mongoose.digium.com:/tmp/cvs-serv14495/pbx

Modified Files:
      Tag: v1-0_stable
	pbx_spool.c 
Log Message:
Correctly handle call flow with outgoing queue, avoiding retries while call acti
ve (bug #1018)


Index: pbx_spool.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx/pbx_spool.c,v
retrieving revision 1.5.2.1
retrieving revision 1.5.2.2
diff -u -d -r1.5.2.1 -r1.5.2.2
--- pbx_spool.c	15 Mar 2004 05:38:52 -0000	1.5.2.1
+++ pbx_spool.c	20 Mar 2004 21:13:30 -0000	1.5.2.2
@@ -50,6 +50,8 @@
 	int retrytime;
 	/* How long to wait for an answer */
 	int waittime;
+	/* PID which is currently calling */
+	int callingpid;
 	
 	/* What to connect to outgoing */
 	char tech[256];
@@ -157,6 +159,14 @@
 						}
 					} else if (!strcasecmp(buf, "retry")) {
 						o->retries++;
+					} else if (!strcasecmp(buf, "startretry")) {
+						if (sscanf(c, "%d", &o->callingpid) != 1) {
+							ast_log(LOG_WARNING, "Unable to retrieve calling PID!\n");
+							o->callingpid = 0;
+						}
+					} else if (!strcasecmp(buf, "endretry") || !strcasecmp(buf, "abortretry")) {
+						o->callingpid = 0;
+						o->retries++;
 					} else if (!strcasecmp(buf, "setvar")) { /* JDG variable support */
 						strncat(o->variable, c, sizeof(o->variable) - strlen(o->variable) - 1);
 						strncat(o->variable, "|", sizeof(o->variable) - strlen(o->variable) - 1);
@@ -182,6 +192,21 @@
 	return 0;
 }
 
+static void safe_append(struct outgoing *o, time_t now, char *s)
+{
+	int fd;
+	FILE *f;
+	fd = open(o->fn, O_WRONLY|O_APPEND);
+	if (fd > -1) {
+		f = fdopen(fd, "a");
+		if (f) {
+			fprintf(f, "%s: %d (%ld) (%ld)\n", s, o->retries, (long)ast_mainpid, (long) now);
+			fclose(f);
+		} else
+			close(fd);
+	}
+}
+
 static void *attempt_thread(void *data)
 {
 	struct outgoing *o = data;
@@ -201,6 +226,9 @@
 			/* Max retries exceeded */
 			ast_log(LOG_EVENT, "Queued call to %s/%s expired without completion after %d attempt(s)\n", o->tech, o->dest, o->retries - 1);
 			unlink(o->fn);
+		} else {
+			/* Notate that the call is still active */
+			safe_append(o, time(NULL), "EndRetry");
 		}
 	} else {
 		ast_log(LOG_NOTICE, "Call completed to %s/%s\n", o->tech, o->dest);
@@ -234,23 +262,32 @@
 		f = fopen(fn, "r+");
 		if (f) {
 			if (!apply_outgoing(o, fn, f)) {
-				/* Increment retries */
-				o->retries++;
 #if 0
 				printf("Retries: %d, max: %d\n", o->retries, o->maxretries);
 #endif
-				if (o->retries <= o->maxretries + 1) {
-					/* Add a retry line at the end */
-					fseek(f, 0L, SEEK_END);
-					fprintf(f, "Retry: %d (%ld)\n", o->retries, (long) now);
-					fclose(f);
+				if (o->retries <= o->maxretries) {
+					if (o->callingpid && (o->callingpid == ast_mainpid)) {
+						ast_log(LOG_DEBUG, "Delaying retry since we're currently running '%s'\n", o->fn);
+					} else {
+						/* Increment retries */
+						o->retries++;
+						/* If someone else was calling, they're presumably gone now
+						   so abort their retry and continue as we were... */
+						if (o->callingpid)
+							safe_append(o, time(NULL), "AbortRetry");
+							
+						/* Add a retry line at the end */
+						fseek(f, 0L, SEEK_END);
+						fprintf(f, "StartRetry: %d %d (%ld)\n", ast_mainpid, o->retries, (long) now);
+						fclose(f);
+						launch_service(o);
+					}
 					/* Update the file time */
 					tbuf.actime = atime;
 					tbuf.modtime = now + o->retrytime;
 					if (utime(o->fn, &tbuf))
 						ast_log(LOG_WARNING, "Unable to set utime on %s: %s\n", fn, strerror(errno));
 					now += o->retrytime;
-					launch_service(o);
 					return now;
 				} else {
 					ast_log(LOG_EVENT, "Queued call to %s/%s expired without completion after %d attempt(s)\n", o->tech, o->dest, o->retries - 1);




More information about the svn-commits mailing list