diff -Naur pjproject-2.5.5-orig/pjsip/src/pjsip/sip_transport.c pjproject-2.5.5/pjsip/src/pjsip/sip_transport.c --- pjproject-2.5.5-orig/pjsip/src/pjsip/sip_transport.c 2016-02-25 04:38:34.000000000 +0000 +++ pjproject-2.5.5/pjsip/src/pjsip/sip_transport.c 2016-10-13 13:34:47.838265748 +0000 @@ -461,12 +461,15 @@ */ PJ_DEF(void) pjsip_tx_data_add_ref( pjsip_tx_data *tdata ) { - pj_atomic_inc(tdata->ref_cnt); + pj_atomic_value_t ref_cnt; + ref_cnt = pj_atomic_inc_and_get(tdata->ref_cnt); + PJ_LOG(3,(THIS_FILE, "Add ref pjsip_tx_data: %p ref_cnt: %d", + tdata, (int)ref_cnt)); } static void tx_data_destroy(pjsip_tx_data *tdata) { - PJ_LOG(5,(tdata->obj_name, "Destroying txdata %s", + PJ_LOG(3,(tdata->obj_name, "Destroying txdata %s", pjsip_tx_data_get_info(tdata))); pjsip_tpselector_dec_ref(&tdata->tp_sel); #if defined(PJ_DEBUG) && PJ_DEBUG!=0 @@ -491,11 +494,20 @@ */ PJ_DEF(pj_status_t) pjsip_tx_data_dec_ref( pjsip_tx_data *tdata ) { - pj_assert( pj_atomic_get(tdata->ref_cnt) > 0); - if (pj_atomic_dec_and_get(tdata->ref_cnt) <= 0) { + pj_atomic_value_t ref_cnt; + + PJ_ASSERT_RETURN(tdata && tdata->ref_cnt, PJ_EINVAL); + + ref_cnt = pj_atomic_dec_and_get(tdata->ref_cnt); + pj_assert( ref_cnt >= 0); + if (ref_cnt == 0) { + PJ_LOG(3,(THIS_FILE, "Destroying pjsip_tx_data: %p", + tdata)); tx_data_destroy(tdata); return PJSIP_EBUFDESTROYED; } else { + PJ_LOG(3,(THIS_FILE, "Dec ref pjsip_tx_data: %p ref_cnt: %d", + tdata, (int)ref_cnt)); return PJ_SUCCESS; } }