handle_cause(cause, num);
ast_hangup(original);
} else {
+ struct ast_party_redirecting redirecting;
+
if (single && CAN_EARLY_BRIDGE(peerflags, c, in)) {
ast_rtp_instance_early_bridge_make_compatible(c, in);
}
* deadlock. This is why the handling of c's lock may seem a bit unusual
* here.
*/
+ ast_party_redirecting_init(&redirecting);
+ ast_party_redirecting_copy(&redirecting, &c->redirecting);
ast_channel_unlock(c);
- if (ast_channel_redirecting_macro(c, in, &c->redirecting, 1, 0)) {
- while (ast_channel_trylock(c)) {
- CHANNEL_DEADLOCK_AVOIDANCE(in);
- }
- ast_channel_update_redirecting(in, &c->redirecting, NULL);
- ast_channel_unlock(c);
+ if (ast_channel_redirecting_macro(c, in, &redirecting, 1, 0)) {
+ ast_channel_update_redirecting(in, &redirecting, NULL);
}
+ ast_party_redirecting_free(&redirecting);
+ ast_channel_unlock(in);
ast_clear_flag64(peerflags, OPT_IGNORE_CONNECTEDLINE);
if (ast_test_flag64(peerflags, OPT_CANCEL_TIMEOUT)) {
*to = -1;
}
- ast_channel_unlock(in);
-
if (ast_call(c, stuff, 0)) {
ast_log(LOG_NOTICE, "Forwarding failed to dial '%s/%s'\n",
tech, stuff);
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);
* 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);