res_pjsip_refer: Move the progress dlg release to a serializer
Although the dlg session count was incremented in a pjsip servant thread, there's no guarantee that the last thread to unref this progress object was one. Before we decrement, we need to make sure that this is either a servant thread or that we push the decrement to a serializer that is one. Because pjsip_dlg_dec_session requires the dialog lock, we don't want to wait on the task to complete if we had to push it to a serializer. Change-Id: I8ff2d5d94be3ff04298394070434e22a7d3cbc41
This commit is contained in:
parent
5f1c21e4ca
commit
269bb08ea2
|
@ -340,6 +340,11 @@ static pjsip_evsub_user refer_progress_evsub_cb = {
|
||||||
.on_evsub_state = refer_progress_on_evsub_state,
|
.on_evsub_state = refer_progress_on_evsub_state,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int dlg_releaser_task(void *data) {
|
||||||
|
pjsip_dlg_dec_session((pjsip_dialog *)data, &refer_progress_module);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*! \brief Destructor for REFER progress sutrcture */
|
/*! \brief Destructor for REFER progress sutrcture */
|
||||||
static void refer_progress_destroy(void *obj)
|
static void refer_progress_destroy(void *obj)
|
||||||
{
|
{
|
||||||
|
@ -350,7 +355,21 @@ static void refer_progress_destroy(void *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress->dlg) {
|
if (progress->dlg) {
|
||||||
pjsip_dlg_dec_session(progress->dlg, &refer_progress_module);
|
/*
|
||||||
|
* Although the dlg session count was incremented in a pjsip servant
|
||||||
|
* thread, there's no guarantee that the last thread to unref this progress
|
||||||
|
* object was one. Before we decrement, we need to make sure that this
|
||||||
|
* is either a servant thread or that we push the decrement to a
|
||||||
|
* serializer that is one.
|
||||||
|
*
|
||||||
|
* Because pjsip_dlg_dec_session requires the dialog lock, we don't want
|
||||||
|
* to wait on the task to complete if we had to push it to a serializer.
|
||||||
|
*/
|
||||||
|
if (ast_sip_thread_is_servant()) {
|
||||||
|
pjsip_dlg_dec_session(progress->dlg, &refer_progress_module);
|
||||||
|
} else {
|
||||||
|
ast_sip_push_task(NULL, dlg_releaser_task, progress->dlg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ao2_cleanup(progress->transfer_data);
|
ao2_cleanup(progress->transfer_data);
|
||||||
|
|
Loading…
Reference in New Issue