pjsip: Fix deadlock with suspend taskprocessor on masquerade
authorAlexei Gradinari <alex2grad@gmail.com>
Sat, 6 Aug 2016 15:57:08 +0000 (11:57 -0400)
committerAlexei Gradinari <alex2grad@gmail.com>
Wed, 10 Aug 2016 20:14:38 +0000 (15:14 -0500)
commit820879415f7b6dd7ea300b6b43308d8cffb7256d
tree6c3e41082f474332d571fe29d95a87b982798592
parentd78fe8fed0d0a76e11b2884a65b66e82b28a6019
pjsip: Fix deadlock with suspend taskprocessor on masquerade

If both channels which should be masqueraded
are in the same serializer:
1st channel will be locked waiting condition 'complete'
2nd channel will be locked waiting condition 'suspended'

On heavy load system a chance that both channels will be in
the same serializer 'pjsip/distibutor' is very high.

To reproduce compile res_pjsip/pjsip_distributor.c with
DISTRIBUTOR_POOL_SIZE=1

Steps to reproduce:
1. Party A calls Party B (bridged call 'AB')
2. Party B places Party A on hold
3. Party B calls Voicemail app (non-bridged call 'BV')
4. Party B attended transfers Party A to voicemail using REFER.
5. When asterisk masquerades calls 'AB' and 'BV',
   a deadlock is happened.

This patch adds a suspension indicator to the taskprocessor.
When a session suspends/unsuspends the serializer
it sets the indicator to the appropriate state.
The session checks the suspension indicator before
suspend the serializer.

ASTERISK-26145 #close

Change-Id: Iaaebee60013a58c942ba47b1b4930a63e686663b
include/asterisk/taskprocessor.h
main/taskprocessor.c
res/res_pjsip_session.c