]> git.ipfire.org Git - thirdparty/asterisk.git/commit
DNS: Need to use the same serializer for a pjproject SIP transaction. 27/627/3
authorRichard Mudgett <rmudgett@digium.com>
Fri, 5 Jun 2015 20:37:33 +0000 (15:37 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 11 Jun 2015 00:22:13 +0000 (19:22 -0500)
commit30cd559345853e3c057de10d3b21b577082a06c5
tree617b6ab46a9d1f954daabd39fa1f674833e4e60b
parentb23f33e7e5bc1524d3e2b3536174590db575055e
DNS: Need to use the same serializer for a pjproject SIP transaction.

All send/receive processing for a SIP transaction needs to be done under
the same threadpool serializer to prevent reentrancy problems inside
pjproject when using an external DNS resolver to process messages for the
transaction.

* Add threadpool API call to get the current serializer associated with
the worker thread.

* Pick a serializer from a pool of default serializers if the caller of
res_pjsip.c:ast_sip_push_task() does not provide one.

This is a simple way to ensure that all outgoing SIP request messages are
processed under a serializer.  Otherwise, any place where a pushed task is
done that would result in an outgoing out-of-dialog request would need to
be modified to supply a serializer.  Serializers from the default
serializer pool are picked in a round robin sequence for simplicity.

A side effect is that the default serializer pool will limit the growth of
the thread pool from random tasks.  This is not necessarily a bad thing.

* Made pjsip_resolver.c use the requesting thread's serializer to execute
the async callback.

* Made pjsip_distributor.c save the thread's serializer name on the
outgoing request tdata struct so the response can be processed under the
same serializer.

ASTERISK-25115 #close
Reported by: John Bigelow

Change-Id: Iea71c16ce1132017b5791635e198b8c27973f40a
include/asterisk/threadpool.h
main/threadpool.c
res/res_pjsip.c
res/res_pjsip/pjsip_distributor.c
res/res_pjsip/pjsip_resolver.c