[Asterisk-cvs] asterisk pbx.c,1.272,1.273

kpfleming kpfleming
Tue Sep 13 18:01:09 CDT 2005


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

Modified Files:
	pbx.c 
Log Message:
check call limit in ast_pbx_start(), instead of waiting until background thread has been launched (needed for issue #5131)


Index: pbx.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx.c,v
retrieving revision 1.272
retrieving revision 1.273
diff -u -d -r1.272 -r1.273
--- pbx.c	7 Sep 2005 21:01:31 -0000	1.272
+++ pbx.c	13 Sep 2005 21:59:45 -0000	1.273
@@ -2407,56 +2407,87 @@
 	return 0;
 }
 
+/* Returns 0 on success, non-zero if call limit was reached */
+static int increase_call_count(const struct ast_channel *c)
+{
+	int failed = 0;
+
+	ast_mutex_lock(&maxcalllock);
+	if (option_maxcalls) {
+		if (countcalls >= option_maxcalls) {
+			ast_log(LOG_NOTICE, "Maximum call limit of %d calls exceeded by '%s'!\n", option_maxcalls, c->name);
+			failed = -1;
+		}
+	}
+	if (!failed)
+		countcalls++;	
+	ast_mutex_unlock(&maxcalllock);
+
+	return failed;
+}
+
+static void decrease_call_count(void)
+{
+	ast_mutex_lock(&maxcalllock);
+	if (countcalls > 0)
+		countcalls--;
+	ast_mutex_unlock(&maxcalllock);
+}
+
 static void *pbx_thread(void *data)
 {
 	/* Oh joyeous kernel, we're a new thread, with nothing to do but
 	   answer this channel and get it going.
 	*/
+	/* NOTE:
+	   The launcher of this function _MUST_ increment 'countcalls'
+	   before invoking the function; it will be decremented when the
+	   PBX has finished running on the channel
+	 */
 	struct ast_channel *c = data;
-	ast_pbx_run(c);
+
+	__ast_pbx_run(c);
+	decrease_call_count();
+
 	pthread_exit(NULL);
+
 	return NULL;
 }
 
-int ast_pbx_start(struct ast_channel *c)
+enum ast_pbx_result ast_pbx_start(struct ast_channel *c)
 {
 	pthread_t t;
 	pthread_attr_t attr;
+
 	if (!c) {
 		ast_log(LOG_WARNING, "Asked to start thread on NULL channel?\n");
-		return -1;
+		return AST_PBX_FAILED;
 	}
 	   
+	if (increase_call_count(c))
+		return AST_PBX_CALL_LIMIT;
+
 	/* Start a new thread, and get something handling this channel. */
 	pthread_attr_init(&attr);
 	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 	if (ast_pthread_create(&t, &attr, pbx_thread, c)) {
 		ast_log(LOG_WARNING, "Failed to create new channel thread\n");
-		return -1;
+		return AST_PBX_FAILED;
 	}
-	return 0;
+
+	return AST_PBX_SUCCESS;
 }
 
-int ast_pbx_run(struct ast_channel *c)
+enum ast_pbx_result ast_pbx_run(struct ast_channel *c)
 {
-	int res = 0;
-	ast_mutex_lock(&maxcalllock);
-	if (option_maxcalls) {
-		if (countcalls >= option_maxcalls) {
-			ast_log(LOG_NOTICE, "Maximum call limit of %d calls exceeded by '%s'!\n", option_maxcalls, c->name);
-			res = -1;
-		}
-	}
-	if (!res)
-		countcalls++;	
-	ast_mutex_unlock(&maxcalllock);
-	if (!res) {
-		res = __ast_pbx_run(c);
-		ast_mutex_lock(&maxcalllock);
-		if (countcalls > 0)
-			countcalls--;
-		ast_mutex_unlock(&maxcalllock);
-	}
+	enum ast_pbx_result res = AST_PBX_SUCCESS;
+
+	if (increase_call_count(c))
+		return AST_PBX_CALL_LIMIT;
+
+	res = __ast_pbx_run(c);
+	decrease_call_count();
+
 	return res;
 }
 




More information about the svn-commits mailing list