[asterisk-commits] rmudgett: branch group/bridge_construction r386014 - in /team/group/bridge_co...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Apr 18 11:24:05 CDT 2013
Author: rmudgett
Date: Thu Apr 18 11:24:03 2013
New Revision: 386014
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=386014
Log:
Fix deadlock potential when dissolving a bridge.
Modified:
team/group/bridge_construction/include/asterisk/bridging.h
team/group/bridge_construction/main/bridging.c
Modified: team/group/bridge_construction/include/asterisk/bridging.h
URL: http://svnview.digium.com/svn/asterisk/team/group/bridge_construction/include/asterisk/bridging.h?view=diff&rev=386014&r1=386013&r2=386014
==============================================================================
--- team/group/bridge_construction/include/asterisk/bridging.h (original)
+++ team/group/bridge_construction/include/asterisk/bridging.h Thu Apr 18 11:24:03 2013
@@ -205,6 +205,8 @@
/*! Bridge reconfiguration deferred technology destruction. */
AST_BRIDGE_ACTION_DEFERRED_TECH_DESTROY = 1000,
+ /*! Bridge deferred dissolving. */
+ AST_BRIDGE_ACTION_DEFERRED_DISSOLVING,
};
enum ast_bridge_video_mode_type {
@@ -261,6 +263,8 @@
* \details
* The bridge is being dissolved. Remove any external
* references to the bridge so it can be destroyed.
+ *
+ * \note On entry, self must NOT be locked.
*
* \return Nothing
*/
Modified: team/group/bridge_construction/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/group/bridge_construction/main/bridging.c?view=diff&rev=386014&r1=386013&r2=386014
==============================================================================
--- team/group/bridge_construction/main/bridging.c (original)
+++ team/group/bridge_construction/main/bridging.c Thu Apr 18 11:24:03 2013
@@ -418,6 +418,10 @@
static void bridge_dissolve(struct ast_bridge *bridge)
{
struct ast_bridge_channel *bridge_channel;
+ struct ast_frame action = {
+ .frametype = AST_FRAME_BRIDGE_ACTION,
+ .subclass.integer = AST_BRIDGE_ACTION_DEFERRED_DISSOLVING,
+ };
if (bridge->dissolved) {
return;
@@ -430,7 +434,9 @@
AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
}
- bridge->v_table->dissolving(bridge);
+
+ /* Must defer dissolving bridge because it is already locked. */
+ ast_bridge_queue_action(bridge, &action);
}
/*!
@@ -1110,6 +1116,11 @@
case AST_BRIDGE_ACTION_DEFERRED_TECH_DESTROY:
ast_bridge_unlock(bridge);
bridge_tech_deferred_destroy(bridge, action);
+ ast_bridge_lock(bridge);
+ break;
+ case AST_BRIDGE_ACTION_DEFERRED_DISSOLVING:
+ ast_bridge_unlock(bridge);
+ bridge->v_table->dissolving(bridge);
ast_bridge_lock(bridge);
break;
default:
More information about the asterisk-commits
mailing list