From: Richard Mudgett Date: Fri, 20 Apr 2012 16:23:01 +0000 (+0000) Subject: Use ast_channel_lock_both() where it was inlined before. X-Git-Tag: 11.0.0-beta1~417 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=01194c581139eb19063700418ce2a1df0c69ef02;p=thirdparty%2Fasterisk.git Use ast_channel_lock_both() where it was inlined before. The CHANNEL_DEADLOCK_AVOIDANCE() feature of preserving where the channel lock was originally obtained is overkill where ast_channel_lock_both() was inlined. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@362888 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_dial.c b/apps/app_dial.c index 8cdcb256dd..84b2312c5d 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -902,15 +902,13 @@ static void do_forward(struct chanlist *o, } else { struct ast_party_redirecting redirecting; + ast_channel_lock_both(c, in); + if (single_caller_bored && CAN_EARLY_BRIDGE(peerflags, c, in)) { ast_rtp_instance_early_bridge_make_compatible(c, in); } ast_channel_set_redirecting(c, ast_channel_redirecting(original), NULL); - ast_channel_lock(c); - while (ast_channel_trylock(in)) { - CHANNEL_DEADLOCK_AVOIDANCE(c); - } if (!ast_channel_redirecting(c)->from.number.valid || ast_strlen_zero(ast_channel_redirecting(c)->from.number.str)) { /* @@ -986,10 +984,7 @@ static void do_forward(struct chanlist *o, c = o->chan = NULL; num->nochan++; } else { - ast_channel_lock(c); - while (ast_channel_trylock(in)) { - CHANNEL_DEADLOCK_AVOIDANCE(c); - } + ast_channel_lock_both(c, in); senddialevent(in, c, stuff); ast_channel_unlock(in); ast_channel_unlock(c); @@ -2295,10 +2290,8 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast } pbx_builtin_setvar_helper(tc, "DIALEDPEERNUMBER", numsubst); - ast_channel_lock(tc); - while (ast_channel_trylock(chan)) { - CHANNEL_DEADLOCK_AVOIDANCE(tc); - } + ast_channel_lock_both(tc, chan); + /* Setup outgoing SDP to match incoming one */ if (!outgoing && !rest && CAN_EARLY_BRIDGE(peerflags, chan, tc)) { ast_rtp_instance_early_bridge_make_compatible(tc, chan); diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 55a0b721d6..0487d52385 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -7302,10 +7302,7 @@ static enum ast_bridge_result dahdi_bridge(struct ast_channel *c0, struct ast_ch if (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1)) return AST_BRIDGE_FAILED_NOWARN; - ast_channel_lock(c0); - while (ast_channel_trylock(c1)) { - CHANNEL_DEADLOCK_AVOIDANCE(c0); - } + ast_channel_lock_both(c0, c1); p0 = ast_channel_tech_pvt(c0); p1 = ast_channel_tech_pvt(c1); @@ -7513,10 +7510,7 @@ static enum ast_bridge_result dahdi_bridge(struct ast_channel *c0, struct ast_ch /* Here's our main loop... Start by locking things, looking for private parts, and then balking if anything is wrong */ - ast_channel_lock(c0); - while (ast_channel_trylock(c1)) { - CHANNEL_DEADLOCK_AVOIDANCE(c0); - } + ast_channel_lock_both(c0, c1); p0 = ast_channel_tech_pvt(c0); p1 = ast_channel_tech_pvt(c1); diff --git a/channels/chan_local.c b/channels/chan_local.c index c0657c97be..069f44a2e9 100644 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -194,10 +194,7 @@ static void awesome_locking(struct local_pvt *p, struct ast_channel **outchan, s ao2_lock(p); } else { /* lock both channels first, then get the pvt lock */ - ast_channel_lock(chan); - while (ast_channel_trylock(owner)) { - CHANNEL_DEADLOCK_AVOIDANCE(chan); - } + ast_channel_lock_both(chan, owner); ao2_lock(p); } diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index de807774a1..0f1715b7a0 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -8560,10 +8560,7 @@ static int misdn_attempt_transfer(struct chan_list *active_ch, struct chan_list return -1; } - ast_channel_lock(held_ch->ast); - while (ast_channel_trylock(active_ch->ast)) { - CHANNEL_DEADLOCK_AVOIDANCE(held_ch->ast); - } + ast_channel_lock_both(held_ch->ast, active_ch->ast); transferee = ast_bridged_channel(held_ch->ast); if (!transferee) { diff --git a/main/rtp_engine.c b/main/rtp_engine.c index 445026e3ed..72f247f105 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -1452,12 +1452,7 @@ void ast_rtp_instance_early_bridge_make_compatible(struct ast_channel *c0, struc int res = 0; /* Lock both channels so we can look for the glue that binds them together */ - ast_channel_lock(c0); - while (ast_channel_trylock(c1)) { - ast_channel_unlock(c0); - usleep(1); - ast_channel_lock(c0); - } + ast_channel_lock_both(c0, c1); if (!cap1 || !cap0) { goto done;