Ignore:
Timestamp:
Sep 11, 2015 9:44:52 AM (9 years ago)
Author:
nanang
Message:

Re #1885: Fixed race condition in evsub scenario 2 (Subscription timer callback vs subscription destroy).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-simple/evsub.c

    r5177 r5178  
    236236    pjsip_transaction    *pending_sub;  /**< Pending UAC SUBSCRIBE tsx.     */ 
    237237    pj_timer_entry       *pending_sub_timer; /**< Stop pending sub timer.   */ 
     238    pj_grp_lock_t        *grp_lock;     /* Session group lock       */ 
    238239 
    239240    void                 *mod_data[PJSIP_MAX_MODULE];   /**< Module data.   */ 
     
    515516        timeout.sec = seconds; 
    516517        timeout.msec = 0; 
    517         sub->timer.id = timer_id; 
    518  
    519         pjsip_endpt_schedule_timer(sub->endpt, &sub->timer, &timeout); 
     518 
     519        pj_timer_heap_schedule_w_grp_lock( 
     520                            pjsip_endpt_get_timer_heap(sub->endpt), 
     521                            &sub->timer, &timeout, timer_id, sub->grp_lock); 
    520522 
    521523        PJ_LOG(5,(sub->obj_name, "Timer %s scheduled in %d seconds",  
    522524                  timer_names[sub->timer.id], timeout.sec)); 
    523525    } 
     526} 
     527 
     528 
     529/* 
     530 * Destructor. 
     531 */ 
     532static void evsub_on_destroy(void *obj) 
     533{ 
     534    pjsip_evsub *sub = (pjsip_evsub*)obj; 
     535 
     536    /* Decrement dialog's session */ 
     537    pjsip_dlg_dec_session(sub->dlg, &mod_evsub.mod); 
    524538} 
    525539 
     
    557571    } 
    558572 
    559     /* Decrement dialog's session */ 
    560     pjsip_dlg_dec_session(sub->dlg, &mod_evsub.mod); 
     573    pj_grp_lock_dec_ref(sub->grp_lock); 
    561574} 
    562575 
     
    849862    pjsip_dlg_inc_session(sub->dlg, &mod_evsub.mod); 
    850863 
     864    /* Init group lock */ 
     865    status = pj_grp_lock_create(dlg->pool, NULL, &sub->grp_lock); 
     866    if (status != PJ_SUCCESS) { 
     867        pjsip_dlg_dec_session(sub->dlg, &mod_evsub.mod); 
     868        goto on_return; 
     869    } 
     870 
     871    pj_grp_lock_add_ref(sub->grp_lock); 
     872    pj_grp_lock_add_handler(sub->grp_lock, dlg->pool, sub, &evsub_on_destroy); 
     873 
    851874    /* Done */ 
    852875    *p_evsub = sub; 
     
    938961        sub->accept = (pjsip_accept_hdr*)pjsip_hdr_clone(sub->pool,accept_hdr); 
    939962 
     963    /* Increment dlg session. */ 
     964    pjsip_dlg_inc_session(dlg, &mod_evsub.mod); 
     965 
     966    /* Init group lock */ 
     967    status = pj_grp_lock_create(dlg->pool, NULL, &sub->grp_lock); 
     968    if (status != PJ_SUCCESS) { 
     969        pjsip_dlg_dec_session(sub->dlg, &mod_evsub.mod); 
     970        goto on_return; 
     971    } 
     972 
     973    pj_grp_lock_add_ref(sub->grp_lock); 
     974    pj_grp_lock_add_handler(sub->grp_lock, dlg->pool, sub, &evsub_on_destroy); 
     975 
    940976    /* We can start the session: */ 
    941977 
    942     pjsip_dlg_inc_session(dlg, &mod_evsub.mod); 
    943978    sub->pending_tsx++; 
    944979    tsx->mod_data[mod_evsub.mod.id] = sub; 
    945  
    946980 
    947981    /* Done. */ 
Note: See TracChangeset for help on using the changeset viewer.