From ada7346792452f021911063668997f79fdabc1f1 Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Fri, 5 Jun 2015 15:37:33 -0500 Subject: res_pjsip: 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 and res_pjsip. * 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_distributor.c save the thread's serializer name on the outgoing request tdata struct so the response can be processed under the same serializer. This is a cherry-pick from master. **** ASTERISK-25115 Change-Id: Iea71c16ce1132017b5791635e198b8c27973f40a NOTE: session_inv_on_state_changed() is disassociating the dialog from the session when the invite dialog becomes PJSIP_INV_STATE_DISCONNECTED. Unfortunately this is a tad too soon because our BYE request transaction has not completed yet. ASTERISK-25183 #close Reported by: Matt Jordan Change-Id: I8bad0ae1daf18d75b8c9e55874244b7962df2d0a --- include/asterisk/threadpool.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'include') diff --git a/include/asterisk/threadpool.h b/include/asterisk/threadpool.h index 942d14fc1..75ce0e4e4 100644 --- a/include/asterisk/threadpool.h +++ b/include/asterisk/threadpool.h @@ -217,6 +217,22 @@ struct ast_serializer_shutdown_group *ast_serializer_shutdown_group_alloc(void); */ int ast_serializer_shutdown_group_join(struct ast_serializer_shutdown_group *shutdown_group, int timeout); +/*! + * \brief Get the threadpool serializer currently associated with this thread. + * \since 14.0.0 + * + * \note The returned pointer is valid while the serializer + * thread is running. + * + * \note Use ao2_ref() on serializer if you are going to keep it + * for another thread. To unref it you must then use + * ast_taskprocessor_unreference(). + * + * \retval serializer on success. + * \retval NULL on error or no serializer associated with the thread. + */ +struct ast_taskprocessor *ast_threadpool_serializer_get_current(void); + /*! * \brief Serialized execution of tasks within a \ref ast_threadpool. * -- cgit v1.2.3