summaryrefslogtreecommitdiff
path: root/pjsip-apps
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2016-02-05 04:29:17 +0000
committerNanang Izzuddin <nanang@teluu.com>2016-02-05 04:29:17 +0000
commit3985dd57937870f3d47a4ddd68b477a42ffddec1 (patch)
tree7cfd8a02592a91bbae1f72e1792bac0954a0e1db /pjsip-apps
parent09977f8551064c5972ea5d23605bfd4adb886189 (diff)
Fixed #1902:
- Crash when endpoint has multiple worker threads and SIP TCP transport is disconnected during incoming call handling. - Deprecated pjsip_dlg_create_uas(), replaced by pjsip_dlg_create_uas_and_inc_lock(). - Serialized transaction state notifications (of 'terminated' and 'destroyed') in case of transport error. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5241 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip-apps')
-rw-r--r--pjsip-apps/src/samples/footprint.c2
-rw-r--r--pjsip-apps/src/samples/pjsip-perf.c8
-rw-r--r--pjsip-apps/src/samples/simpleua.c25
-rw-r--r--pjsip-apps/src/samples/sipecho.c11
-rw-r--r--pjsip-apps/src/samples/siprtp.c7
5 files changed, 39 insertions, 14 deletions
diff --git a/pjsip-apps/src/samples/footprint.c b/pjsip-apps/src/samples/footprint.c
index 9b666874..74e6be43 100644
--- a/pjsip-apps/src/samples/footprint.c
+++ b/pjsip-apps/src/samples/footprint.c
@@ -341,7 +341,7 @@ int dummy_function()
pjsip_ua_init_module(NULL, NULL);
pjsip_ua_destroy();
pjsip_dlg_create_uac(NULL, NULL, NULL, NULL, NULL, NULL);
- pjsip_dlg_create_uas(NULL, NULL, NULL, NULL);
+ pjsip_dlg_create_uas_and_inc_lock(NULL, NULL, NULL, NULL);
pjsip_dlg_terminate(NULL);
pjsip_dlg_set_route_set(NULL, NULL);
pjsip_dlg_create_request(NULL, NULL, -1, NULL);
diff --git a/pjsip-apps/src/samples/pjsip-perf.c b/pjsip-apps/src/samples/pjsip-perf.c
index 10bde943..bc963330 100644
--- a/pjsip-apps/src/samples/pjsip-perf.c
+++ b/pjsip-apps/src/samples/pjsip-perf.c
@@ -475,8 +475,8 @@ static pj_bool_t mod_call_on_rx_request(pjsip_rx_data *rdata)
}
/* Create UAS dialog */
- status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata,
- &app.local_contact, &dlg);
+ status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(), rdata,
+ &app.local_contact, &dlg);
if (status != PJ_SUCCESS) {
const pj_str_t reason = pj_str("Unable to create dialog");
pjsip_endpt_respond_stateless( app.sip_endpt, rdata,
@@ -502,9 +502,13 @@ static pj_bool_t mod_call_on_rx_request(pjsip_rx_data *rdata)
if (status != PJ_SUCCESS) {
pjsip_dlg_create_response(dlg, rdata, 500, NULL, &tdata);
pjsip_dlg_send_response(dlg, pjsip_rdata_get_tsx(rdata), tdata);
+ pjsip_dlg_dec_lock(dlg);
return PJ_TRUE;
}
+ /* Invite session has been created, decrement & release dialog lock. */
+ pjsip_dlg_dec_lock(dlg);
+
/* Send 100/Trying if needed */
if (app.server.send_trying) {
status = send_response(call->inv, rdata, 100, &has_initial);
diff --git a/pjsip-apps/src/samples/simpleua.c b/pjsip-apps/src/samples/simpleua.c
index b7f10250..a1bac754 100644
--- a/pjsip-apps/src/samples/simpleua.c
+++ b/pjsip-apps/src/samples/simpleua.c
@@ -725,10 +725,10 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata )
/*
* Create UAS dialog.
*/
- status = pjsip_dlg_create_uas( pjsip_ua_instance(),
- rdata,
- &local_uri, /* contact */
- &dlg);
+ status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(),
+ rdata,
+ &local_uri, /* contact */
+ &dlg);
if (status != PJ_SUCCESS) {
pjsip_endpt_respond_stateless(g_endpt, rdata, 500, NULL,
NULL, NULL);
@@ -741,7 +741,11 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata )
status = pjmedia_endpt_create_sdp( g_med_endpt, rdata->tp_info.pool,
MAX_MEDIA_CNT, g_sock_info, &local_sdp);
- PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
+ pj_assert(status == PJ_SUCCESS);
+ if (status != PJ_SUCCESS) {
+ pjsip_dlg_dec_lock(dlg);
+ return PJ_TRUE;
+ }
/*
@@ -749,7 +753,16 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata )
* capability to the session.
*/
status = pjsip_inv_create_uas( dlg, rdata, local_sdp, 0, &g_inv);
- PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
+ pj_assert(status == PJ_SUCCESS);
+ if (status != PJ_SUCCESS) {
+ pjsip_dlg_dec_lock(dlg);
+ return PJ_TRUE;
+ }
+
+ /*
+ * Invite session has been created, decrement & release dialog lock.
+ */
+ pjsip_dlg_dec_lock(dlg);
/*
diff --git a/pjsip-apps/src/samples/sipecho.c b/pjsip-apps/src/samples/sipecho.c
index 6c5244d8..b0fb4c2f 100644
--- a/pjsip-apps/src/samples/sipecho.c
+++ b/pjsip-apps/src/samples/sipecho.c
@@ -417,7 +417,7 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata )
pj_sockaddr hostaddr;
char temp[80], hostip[PJ_INET6_ADDRSTRLEN];
pj_str_t local_uri;
- pjsip_dialog *dlg;
+ pjsip_dialog *dlg = NULL;
pjsip_rdata_sdp_info *sdp_info;
pjmedia_sdp_session *answer = NULL;
pjsip_tx_data *tdata = NULL;
@@ -498,13 +498,18 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata )
pj_ansi_sprintf(temp, "<sip:sipecho@%s:%d>", hostip, sip_port);
local_uri = pj_str(temp);
- status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata,
- &local_uri, &dlg);
+ status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(), rdata,
+ &local_uri, &dlg);
if (status == PJ_SUCCESS)
answer = create_answer((int)(call-app.call), dlg->pool, sdp_info->sdp);
+
if (status == PJ_SUCCESS)
status = pjsip_inv_create_uas( dlg, rdata, answer, 0, &call->inv);
+
+ if (dlg)
+ pjsip_dlg_dec_lock(dlg);
+
if (status == PJ_SUCCESS)
status = pjsip_inv_initial_answer(call->inv, rdata, 100,
NULL, NULL, &tdata);
diff --git a/pjsip-apps/src/samples/siprtp.c b/pjsip-apps/src/samples/siprtp.c
index 262e2033..8e74c338 100644
--- a/pjsip-apps/src/samples/siprtp.c
+++ b/pjsip-apps/src/samples/siprtp.c
@@ -637,8 +637,8 @@ static void process_incoming_call(pjsip_rx_data *rdata)
}
/* Create UAS dialog */
- status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata,
- &app.local_contact, &dlg);
+ status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(), rdata,
+ &app.local_contact, &dlg);
if (status != PJ_SUCCESS) {
const pj_str_t reason = pj_str("Unable to create dialog");
pjsip_endpt_respond_stateless( app.sip_endpt, rdata,
@@ -655,9 +655,12 @@ static void process_incoming_call(pjsip_rx_data *rdata)
if (status != PJ_SUCCESS) {
pjsip_dlg_create_response(dlg, rdata, 500, NULL, &tdata);
pjsip_dlg_send_response(dlg, pjsip_rdata_get_tsx(rdata), tdata);
+ pjsip_dlg_dec_lock(dlg);
return;
}
+ /* Invite session has been created, decrement & release dialog lock */
+ pjsip_dlg_dec_lock(dlg);
/* Attach call data to invite session */
call->inv->mod_data[mod_siprtp.id] = call;