Ignore:
Timestamp:
Jan 29, 2020 4:05:51 AM (4 years ago)
Author:
ming
Message:

Fixed #2264: Potential deadlock between pjsua lock and sip transport's lock

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_reg.c

    r6134 r6142  
    398398} 
    399399 
     400PJ_DEF(void) pjsip_regc_add_ref( pjsip_regc *regc ) 
     401{ 
     402    pj_assert(regc); 
     403    pj_atomic_inc(regc->busy_ctr); 
     404} 
     405 
     406PJ_DEF(pj_status_t) pjsip_regc_dec_ref( pjsip_regc *regc ) 
     407{ 
     408    pj_assert(regc); 
     409    if (pj_atomic_dec_and_get(regc->busy_ctr)==0 && regc->_delete_flag) { 
     410        pjsip_regc_destroy(regc); 
     411        return PJ_EGONE; 
     412    } 
     413     
     414    return PJ_SUCCESS; 
     415} 
     416 
    400417PJ_DEF(pj_status_t) pjsip_regc_set_credentials( pjsip_regc *regc, 
    401418                                                int count, 
     
    788805     * in pjsip_regc_send() or in the callback 
    789806     */ 
    790     pj_atomic_inc(regc->busy_ctr); 
     807    pjsip_regc_add_ref(regc); 
    791808 
    792809    entry->id = 0; 
     
    804821 
    805822    /* Delete the record if user destroy regc during the callback. */ 
    806     if (pj_atomic_dec_and_get(regc->busy_ctr)==0 && regc->_delete_flag) { 
    807         pjsip_regc_destroy(regc); 
    808     } 
     823    pjsip_regc_dec_ref(regc); 
    809824} 
    810825 
     
    10681083    pj_bool_t update_contact = PJ_FALSE; 
    10691084 
    1070     pj_atomic_inc(regc->busy_ctr); 
     1085    pjsip_regc_add_ref(regc); 
    10711086    pj_lock_acquire(regc->lock); 
    10721087 
     
    13681383 
    13691384    /* Delete the record if user destroy regc during the callback. */ 
    1370     if (pj_atomic_dec_and_get(regc->busy_ctr)==0 && regc->_delete_flag) { 
    1371         pjsip_regc_destroy(regc); 
    1372     } 
     1385    pjsip_regc_dec_ref(regc); 
    13731386} 
    13741387 
     
    13801393    pj_uint32_t cseq; 
    13811394 
    1382     pj_atomic_inc(regc->busy_ctr); 
     1395    pjsip_regc_add_ref(regc); 
    13831396    pj_lock_acquire(regc->lock); 
    13841397 
     
    14811494 
    14821495    /* Delete the record if user destroy regc during the callback. */ 
    1483     if (pj_atomic_dec_and_get(regc->busy_ctr)==0 && regc->_delete_flag) { 
    1484         pjsip_regc_destroy(regc); 
    1485     } 
     1496    pjsip_regc_dec_ref(regc); 
    14861497 
    14871498    return status; 
Note: See TracChangeset for help on using the changeset viewer.