Ignore:
Timestamp:
Apr 23, 2019 8:42:45 AM (5 years ago)
Author:
nanang
Message:

Fixed #2191:

  • Stricter double timer entry scheduling prevention.
  • Integrate group lock in SIP transport, e.g: for add/dec ref, for timer scheduling.


File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_transport.c

    r5909 r5971  
    10131013    PJ_UNUSED_ARG(timer_heap); 
    10141014 
     1015    if (entry->id == PJ_FALSE) 
     1016        return; 
     1017 
    10151018    entry->id = PJ_FALSE; 
    10161019    pjsip_transport_destroy(tp); 
     
    10491052 
    10501053    PJ_ASSERT_RETURN(tp != NULL, PJ_EINVAL); 
     1054 
     1055    /* Add ref transport group lock, if any */ 
     1056    if (tp->grp_lock) 
     1057        pj_grp_lock_add_ref(tp->grp_lock); 
    10511058 
    10521059    /* Cache some vars for checking transport validity later */ 
     
    10641071        { 
    10651072            if (tp->idle_timer.id != PJ_FALSE) { 
     1073                tp->idle_timer.id = PJ_FALSE; 
    10661074                pjsip_endpt_cancel_timer(tp->tpmgr->endpt, &tp->idle_timer); 
    1067                 tp->idle_timer.id = PJ_FALSE; 
    10681075            } 
    10691076        } 
     
    11151122            } 
    11161123 
    1117             pj_assert(tp->idle_timer.id == 0); 
    1118             tp->idle_timer.id = PJ_TRUE; 
    1119             pjsip_endpt_schedule_timer(tp->tpmgr->endpt, &tp->idle_timer,  
    1120                                        &delay); 
     1124            /* Avoid double timer entry scheduling */ 
     1125            if (pj_timer_entry_running(&tp->idle_timer)) 
     1126                pjsip_endpt_cancel_timer(tp->tpmgr->endpt, &tp->idle_timer); 
     1127 
     1128            pjsip_endpt_schedule_timer_w_grp_lock(tp->tpmgr->endpt, 
     1129                                                  &tp->idle_timer, 
     1130                                                  &delay, 
     1131                                                  PJ_TRUE, 
     1132                                                  tp->grp_lock); 
    11211133        } 
    11221134        pj_lock_release(tpmgr->lock); 
    11231135    } 
     1136 
     1137    /* Dec ref transport group lock, if any */ 
     1138    if (tp->grp_lock) 
     1139        pj_grp_lock_dec_ref(tp->grp_lock); 
    11241140 
    11251141    return PJ_SUCCESS; 
     
    11691185    pj_hash_set(tp->pool, mgr->table, &tp->key, key_len, hval, tp); 
    11701186 
     1187    /* Add ref transport group lock, if any */ 
     1188    if (tp->grp_lock) 
     1189        pj_grp_lock_add_ref(tp->grp_lock); 
     1190 
    11711191    pj_lock_release(mgr->lock); 
    11721192 
     
    12001220    //pj_assert(tp->idle_timer.id == PJ_FALSE); 
    12011221    if (tp->idle_timer.id != PJ_FALSE) { 
     1222        tp->idle_timer.id = PJ_FALSE; 
    12021223        pjsip_endpt_cancel_timer(mgr->endpt, &tp->idle_timer); 
    1203         tp->idle_timer.id = PJ_FALSE; 
    12041224    } 
    12051225 
     
    12261246    pj_lock_release(mgr->lock); 
    12271247    pj_lock_release(tp->lock); 
     1248 
     1249    /* Dec ref transport group lock, if any */ 
     1250    if (tp->grp_lock) 
     1251        pj_grp_lock_dec_ref(tp->grp_lock); 
    12281252 
    12291253    /* Destroy. */ 
Note: See TracChangeset for help on using the changeset viewer.