mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-19 19:52:48 +00:00
Merged revisions 288079-288080 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r288079 | rmudgett | 2010-09-21 15:29:51 -0500 (Tue, 21 Sep 2010) | 2 lines Protect channel access in CONNECTED_LINE and REDIRECTING interception macro launch code. ........ r288080 | rmudgett | 2010-09-21 15:29:59 -0500 (Tue, 21 Sep 2010) | 8 lines Simplify locking code for REDIRECTING interception macro when forwarding a call. Simplified the locking code by using a local copy of the redirecting party information in app_dial.c:do_forward() and app_queue.c:wait_for_answer() for launching the REDIRECTING interception macro when a call is forwarded. Reduced the lock time of the 'o->chan' and 'in' channels. ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@288081 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -3414,6 +3414,8 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
|
||||
o->stillgoing = 0;
|
||||
numnochan++;
|
||||
} else {
|
||||
struct ast_party_redirecting redirecting;
|
||||
|
||||
ast_channel_lock(o->chan);
|
||||
while (ast_channel_trylock(in)) {
|
||||
CHANNEL_DEADLOCK_AVOIDANCE(o->chan);
|
||||
@@ -3449,27 +3451,24 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
|
||||
* deadlock. This is why the handling of o->chan's lock may
|
||||
* seem a bit unusual here.
|
||||
*/
|
||||
ast_party_redirecting_init(&redirecting);
|
||||
ast_party_redirecting_copy(&redirecting, &o->chan->redirecting);
|
||||
ast_channel_unlock(o->chan);
|
||||
res = ast_channel_redirecting_macro(o->chan, in, &o->chan->redirecting, 1, 0);
|
||||
while (ast_channel_trylock(o->chan)) {
|
||||
CHANNEL_DEADLOCK_AVOIDANCE(in);
|
||||
}
|
||||
res = ast_channel_redirecting_macro(o->chan, in, &redirecting, 1, 0);
|
||||
if (res) {
|
||||
ast_channel_update_redirecting(in, &o->chan->redirecting, NULL);
|
||||
ast_channel_update_redirecting(in, &redirecting, NULL);
|
||||
}
|
||||
ast_party_redirecting_free(&redirecting);
|
||||
ast_channel_unlock(in);
|
||||
|
||||
update_connectedline = 1;
|
||||
|
||||
if (ast_call(o->chan, stuff, 0)) {
|
||||
ast_log(LOG_NOTICE, "Forwarding failed to dial '%s/%s'\n",
|
||||
tech, stuff);
|
||||
ast_channel_unlock(o->chan);
|
||||
do_hang(o);
|
||||
numnochan++;
|
||||
} else {
|
||||
ast_channel_unlock(o->chan);
|
||||
}
|
||||
ast_channel_unlock(in);
|
||||
}
|
||||
/* Hangup the original channel now, in case we needed it */
|
||||
ast_hangup(winner);
|
||||
|
Reference in New Issue
Block a user