summaryrefslogtreecommitdiff
path: root/main/bridge_channel.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2013-08-26 16:25:39 +0000
committerRichard Mudgett <rmudgett@digium.com>2013-08-26 16:25:39 +0000
commitd647b4ae022cbce0aaee03e8ba51de013ed0ae80 (patch)
tree19afb2e476cd066099c8627d1137431c5b218973 /main/bridge_channel.c
parent13dbdd1ae729002fa07c63d35cbea3967cf43cd1 (diff)
bridging: Fix a livelock with local channel optimization.
Use a better means of waking up the bridge channel thread. ........ Merged revisions 397650 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@397651 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/bridge_channel.c')
-rw-r--r--main/bridge_channel.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/main/bridge_channel.c b/main/bridge_channel.c
index 9de612ea6..92ad660ea 100644
--- a/main/bridge_channel.c
+++ b/main/bridge_channel.c
@@ -110,10 +110,8 @@ int ast_bridge_channel_notify_talking(struct ast_bridge_channel *bridge_channel,
static void bridge_channel_poke(struct ast_bridge_channel *bridge_channel)
{
if (!pthread_equal(pthread_self(), bridge_channel->thread)) {
- while (bridge_channel->waiting) {
- pthread_kill(bridge_channel->thread, SIGURG);
- sched_yield();
- }
+ /* Wake up the bridge channel thread. */
+ ast_queue_frame(bridge_channel->chan, &ast_null_frame);
}
}
@@ -1883,13 +1881,11 @@ static void bridge_channel_wait(struct ast_bridge_channel *bridge_channel)
ast_debug(10, "Bridge %s: %p(%s) is going into a waitfor\n",
bridge_channel->bridge->uniqueid, bridge_channel,
ast_channel_name(bridge_channel->chan));
- bridge_channel->waiting = 1;
ast_bridge_channel_unlock(bridge_channel);
outfd = -1;
ms = bridge_channel_next_interval(bridge_channel);
chan = ast_waitfor_nandfds(&bridge_channel->chan, 1,
&bridge_channel->alert_pipe[0], 1, NULL, &outfd, &ms);
- bridge_channel->waiting = 0;
if (ast_channel_softhangup_internal_flag(bridge_channel->chan) & AST_SOFTHANGUP_UNBRIDGE) {
ast_channel_clear_softhangup(bridge_channel->chan, AST_SOFTHANGUP_UNBRIDGE);
ast_bridge_channel_lock_bridge(bridge_channel);