summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorzuul <zuul@gerrit.asterisk.org>2016-08-10 19:19:08 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-08-10 19:19:08 -0500
commitdbc78c9faba2b7964a687fc139a6ddc0453a7d0e (patch)
treea86c7b0abc2148b0dd4baf44bb3b9b1e551d22d1 /res
parentc864ebab528696d6a4b7c999ce5b115691e4637e (diff)
parent1589452fdc044dc6233e73e87c0e3735c97a5495 (diff)
Merge "pjsip: Fix deadlock with suspend taskprocessor on masquerade" into 13
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_session.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index 4290f6854..a41e0aa5d 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -1559,6 +1559,11 @@ void ast_sip_session_suspend(struct ast_sip_session *session)
return;
}
+ if (ast_taskprocessor_is_suspended(session->serializer)) {
+ /* The serializer already suspended. */
+ return;
+ }
+
suspender = ao2_alloc(sizeof(*suspender), sip_session_suspender_dtor);
if (!suspender) {
/* We will just have to hope that the system does not deadlock */
@@ -1583,6 +1588,8 @@ void ast_sip_session_suspend(struct ast_sip_session *session)
ast_cond_wait(&suspender->cond_suspended, ao2_object_get_lockaddr(suspender));
}
ao2_unlock(suspender);
+
+ ast_taskprocessor_suspend(session->serializer);
}
void ast_sip_session_unsuspend(struct ast_sip_session *session)
@@ -1602,6 +1609,8 @@ void ast_sip_session_unsuspend(struct ast_sip_session *session)
ao2_unlock(suspender);
ao2_ref(suspender, -1);
+
+ ast_taskprocessor_unsuspend(session->serializer);
}
/*!