[svn-commits] jpeeler: branch jpeeler/bug12269 r149800 - /team/jpeeler/bug12269/channels/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Oct 15 15:39:44 CDT 2008


Author: jpeeler
Date: Wed Oct 15 15:39:43 2008
New Revision: 149800

URL: http://svn.digium.com/view/asterisk?view=rev&rev=149800
Log:
Make this branch actually work.

Modified:
    team/jpeeler/bug12269/channels/chan_agent.c

Modified: team/jpeeler/bug12269/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/team/jpeeler/bug12269/channels/chan_agent.c?view=diff&rev=149800&r1=149799&r2=149800
==============================================================================
--- team/jpeeler/bug12269/channels/chan_agent.c (original)
+++ team/jpeeler/bug12269/channels/chan_agent.c Wed Oct 15 15:39:43 2008
@@ -671,7 +671,7 @@
 {
 	struct agent_pvt *p = ast->tech_pvt;
 	int res = -1;
-ast_log(LOG_NOTICE, "jpeeler: called on %s but really indicating on %s\n", ast->name, p->chan->name);
+//ast_log(LOG_NOTICE, "jpeeler: called on %s but really indicating on %s\n", ast->name, p->chan->name);
 	ast_mutex_lock(&p->lock);
 	if (p->chan && !ast_check_hangup(p->chan))
 		res = p->chan->tech->indicate ? p->chan->tech->indicate(p->chan, condition, data, datalen) : -1;
@@ -1087,6 +1087,12 @@
 	p->app_sleep_cond = 0;
 	ast_mutex_lock(&p->app_lock);
 	p->app_lock_flag = 1;
+/* jpeeler: optimization?
+	if (ast_test_flag(p->chan, AST_FLAG_BLOCKING)) {
+		ast_log(LOG_NOTICE, "jpeeler: Blocker detected\n");
+		pthread_kill(p->chan->blocker, SIGURG);
+	}
+*/
 	ast_mutex_unlock(&p->app_lock);
 	if(ast_strlen_zero(p->loginchan) && !p->app_lock_flag) {
 		if (p->chan) {
@@ -1125,11 +1131,9 @@
 	if (p->chan)
 		ast_indicate(p->chan, AST_CONTROL_UNHOLD);
 	/* After the above step, there should not be any blockers. */
-	if (p->chan) {
-		if (ast_test_flag(p->chan, AST_FLAG_BLOCKING)) {
-			ast_log( LOG_ERROR, "A blocker exists after agent channel ownership acquired\n" );
-			ast_assert(ast_test_flag(p->chan, AST_FLAG_BLOCKING) == 0);
-		}
+	if (p->chan && ast_test_flag(p->chan, AST_FLAG_BLOCKING) && p->app_lock_flag == 0) {
+		ast_log(LOG_ERROR, "A blocker (%p) exists on %s after agent channel ownership acquired\n",(void *) p->chan->blocker, p->chan->name);
+		ast_assert(ast_test_flag(p->chan, AST_FLAG_BLOCKING) == 0);
 	}
 	return tmp;
 }
@@ -2271,21 +2275,21 @@
 							ast_mutex_unlock(&p->lock);
 							AST_LIST_UNLOCK(&agents);
 							/*	Synchronize channel ownership between call to agent and itself. */
-ast_log(LOG_NOTICE, "jpeeler: waiting for app_lock\n");
+//ast_log(LOG_NOTICE, "jpeeler: waiting for app_lock (app_lock_flag=%d)\n", p->app_lock_flag);
 							ast_mutex_lock(&p->app_lock);
+//ast_log(LOG_NOTICE, "jpeeler: app_lock obtained by thread %p\n", (void *) pthread_self());
 							if (p->app_lock_flag == 1) {
+								p->app_lock_flag = 0;
 								ast_cond_wait(&p->app_complete_cond, &p->app_lock);
 							}
-ast_log(LOG_NOTICE, "jpeeler: app_lock obtained by thread %p\n", (void *) pthread_self());
+							ast_mutex_unlock(&p->app_lock);
+//ast_log(LOG_NOTICE, "jpeeler: app_lock released by thread %p\n", (void *) pthread_self());
 							ast_mutex_lock(&p->lock);
 							ast_mutex_unlock(&p->lock);
 							if (p->ackcall > 1) 
 								res = agent_ack_sleep(p);
 							else
 								res = ast_safe_sleep_conditional( chan, 1000, agent_cont_sleep, p );
-							p->app_lock_flag = 0;
-							ast_mutex_unlock( &p->app_lock );
-ast_log(LOG_NOTICE, "jpeeler: app_lock released by thread %p\n", (void *) pthread_self());
 							if ((p->ackcall > 1)  && (res == 1)) {
 								AST_LIST_LOCK(&agents);
 								ast_mutex_lock(&p->lock);




More information about the svn-commits mailing list