[asterisk-dev] [Code Review] fix Deadlock with attended transfers of SIP calls
Matthew Nicholson
reviewboard at asterisk.org
Fri Feb 25 09:42:22 CST 2011
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/1126/#review3218
-----------------------------------------------------------
trunk/channels/chan_sip.c
<https://reviewboard.asterisk.org/r/1126/#comment6697>
ast_channel_unlock(p->owner);
One typo there, beyond that, it looks good.
- Matthew
On 2011-02-24 20:17:01, Alec Davis wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/1126/
> -----------------------------------------------------------
>
> (Updated 2011-02-24 20:17:01)
>
>
> Review request for Asterisk Developers.
>
>
> Summary
> -------
>
> in 1.8.2.3 and prior to trunk r306216, when the REFER transfer is complete then a deadlock occurs.
>
> Reason being sip_set_rtp_peer locks pvt, then pbx_builtin_getvar_helper tries to lock chan
> Violating locking order.
>
> === Thread ID: -1292625008 (do_monitor started at [24470] chan_sip.c restart_monitor())
> === ---> Lock #0 (chan_sip.c): MUTEX 23964 handle_request_do &netlock 0xb6796e80 (1)
> === ---> Lock #1 (channel.c): MUTEX 6211 ast_do_masquerade channels 0x8d4e0c8 (1)
> === ---> Lock #2 (channel.c): MUTEX 6214 ast_do_masquerade original 0xbd98f48 (1)
> === ---> Lock #3 (channel.c): MUTEX 6234 ast_do_masquerade clonechan 0xb24bf7d0 (1)
> === ---> Waiting for Lock #4 (chan_sip.c): MUTEX 6164 sip_fixup p 0xb24bab10 (1)
> === --- ---> Locked Here: chan_sip.c line 27632 (sip_set_rtp_peer)
>
> === -------------------------------------------------------------------
> ===
> === Thread ID: -1315861616 (pbx_thread started at [ 5035] pbx.c ast_pbx_start())
> === ---> Lock #0 (chan_sip.c): MUTEX 27632 sip_set_rtp_peer p 0xb24bab10 (1)
> === ---> Waiting for Lock #1 (pbx.c): MUTEX 9467 pbx_builtin_getvar_helper chan 0xb24bf7d0 (1)
> === --- ---> Locked Here: channel.c line 6234 (ast_do_masquerade)
>
> multiple other bug reports reveal the sip_set_rtp_peer pvt locking issue.
>
> Solution:
> inc pvt refcount to prevent the possibility of it disappearing while unlocked.
> unlock the pvt
> call transmit_reinvite_with_sdp (which finishes up invoking pbx_builtin_getvar_helper)
> lock the pvt
> dec pvt refcount
>
> Applies to 1.8.2.3 and trunk. Both verified deadlocks.
> Presumably 1.8 branch
>
> r306216 tries to solve it, but causes more channel locking issues
> see https://issues.asterisk.org/view.php?id=18837#132337
>
>
> This addresses bugs 18468, 18491, 18734, and 18837.
> https://issues.asterisk.org/view.php?id=18468
> https://issues.asterisk.org/view.php?id=18491
> https://issues.asterisk.org/view.php?id=18734
> https://issues.asterisk.org/view.php?id=18837
>
>
> Diffs
> -----
>
> trunk/channels/chan_sip.c 308944
>
> Diff: https://reviewboard.asterisk.org/r/1126/diff
>
>
> Testing
> -------
>
> Testing: trunk
>
> 3 SIP phones.
>
> A calls B, and B answers on line 1.
> B puts A on hold by selecting line2.
> B calls C, and C answers.
> B initiates transfer of line1 to line2, phone uses REFER.
>
>
> Thanks,
>
> Alec
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20110225/a88a4ba4/attachment.htm>
More information about the asterisk-dev
mailing list