summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_call.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_call.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 86306ffd..bb549654 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -982,10 +982,19 @@ on_incoming_call_med_tp_complete(pjsua_call_id call_id,
pjmedia_sdp_session *answer;
pjsip_tx_data *response = NULL;
unsigned options = 0;
+ pjsip_dialog *dlg = call->async_call.dlg;
int sip_err_code = (info? info->sip_err_code: 0);
pj_status_t status = (info? info->status: PJ_SUCCESS);
PJSUA_LOCK();
+
+ /* Increment the dialog's lock to prevent it to be destroyed prematurely,
+ * such as in case of transport error.
+ */
+ pjsip_dlg_inc_lock(dlg);
+
+ /* Decrement dialog session. */
+ pjsip_dlg_dec_session(dlg, &pjsua_var.mod);
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Error initializing media channel", status);
@@ -996,6 +1005,7 @@ on_incoming_call_med_tp_complete(pjsua_call_id call_id,
if (call->async_call.med_ch_deinit) {
pjsua_media_channel_deinit(call->index);
call->med_ch_cb = NULL;
+ pjsip_dlg_dec_lock(dlg);
PJSUA_UNLOCK();
return PJ_SUCCESS;
}
@@ -1067,7 +1077,9 @@ on_return:
process_pending_call_answer(call);
}
}
-
+
+ pjsip_dlg_dec_lock(dlg);
+
PJSUA_UNLOCK();
return status;
}
@@ -1351,8 +1363,8 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
}
/* Create dialog: */
- status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata,
- &contact, &dlg);
+ status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(), rdata,
+ &contact, &dlg);
if (status != PJ_SUCCESS) {
pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL,
NULL, NULL);
@@ -1460,6 +1472,8 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
call->async_call.dlg = dlg;
pj_list_init(&call->async_call.call_var.inc_call.answers);
+ pjsip_dlg_inc_session(dlg, &pjsua_var.mod);
+
/* Init media channel, only when there is offer or call replace request.
* For incoming call without SDP offer, media channel init will be done
* in pjsua_call_answer(), see ticket #1526.
@@ -1501,6 +1515,8 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
}
pjsip_dlg_dec_lock(dlg);
+ pjsip_dlg_dec_session(dlg, &pjsua_var.mod);
+
call->inv = NULL;
call->async_call.dlg = NULL;
goto on_return;
@@ -1618,6 +1634,10 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
/* This INVITE request has been handled. */
on_return:
+ if (dlg) {
+ pjsip_dlg_dec_lock(dlg);
+ }
+
pj_log_pop_indent();
PJSUA_UNLOCK();
return PJ_TRUE;