[asterisk-commits] rmudgett: trunk r319260 - in /trunk: ./ main/ccss.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon May 16 15:41:35 CDT 2011


Author: rmudgett
Date: Mon May 16 15:41:31 2011
New Revision: 319260

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=319260
Log:
Merged revisions 319259 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r319259 | rmudgett | 2011-05-16 15:33:37 -0500 (Mon, 16 May 2011) | 13 lines
  
  Deadlock between generic CCSS agent and native ISDN CCSS.
  
  Deadlock can occur when the generic CCSS agent is deleting duplicate CC
  offers and the native ISDN CC driver is processing an incoming CC message.
  The cc_core_instances container lock cannot be held when an agent or
  monitor callback is invoked without the possibility of a deadlock.
  
  * Make kill_duplicate_offers() remove the reference in cc_core_instances
  outside of the container lock.
  
  JIRA AST-566
  JIRA SWP-3469
........

Modified:
    trunk/   (props changed)
    trunk/main/ccss.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: trunk/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/ccss.c?view=diff&rev=319260&r1=319259&r2=319260
==============================================================================
--- trunk/main/ccss.c (original)
+++ trunk/main/ccss.c Mon May 16 15:41:31 2011
@@ -2332,7 +2332,18 @@
 static void kill_duplicate_offers(char *caller)
 {
 	unsigned long match_flags = MATCH_NO_REQUEST;
-	ao2_t_callback_data(cc_core_instances, OBJ_UNLINK | OBJ_NODATA, match_agent, caller, &match_flags, "Killing duplicate offers");
+	struct ao2_iterator *dups_iter;
+
+	/*
+	 * Must remove the ref that was in cc_core_instances outside of
+	 * the container lock to prevent deadlock.
+	 */
+	dups_iter = ao2_t_callback_data(cc_core_instances, OBJ_MULTIPLE | OBJ_UNLINK,
+		match_agent, caller, &match_flags, "Killing duplicate offers");
+	if (dups_iter) {
+		/* Now actually unref any duplicate offers by simply destroying the iterator. */
+		ao2_iterator_destroy(dups_iter);
+	}
 }
 
 static void check_callback_sanity(const struct ast_cc_agent_callbacks *callbacks)




More information about the asterisk-commits mailing list