Changeset 4095


Ignore:
Timestamp:
Apr 26, 2012 11:53:33 AM (12 years ago)
Author:
bennylp
Message:

Fixed #1495: UDP keep-alive is still running even after account is deleted. It cannot be updated with pjsua_acc_modify() either

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/1.x/pjsip/src/pjsua-lib/pjsua_acc.c

    r4041 r4095  
    3434 
    3535static void schedule_reregistration(pjsua_acc *acc); 
     36static void keep_alive_timer_cb(pj_timer_heap_t *th, pj_timer_entry *te); 
    3637 
    3738/* 
     
    562563PJ_DEF(pj_status_t) pjsua_acc_del(pjsua_acc_id acc_id) 
    563564{ 
     565    pjsua_acc *acc; 
    564566    unsigned i; 
    565567 
     
    570572    PJSUA_LOCK(); 
    571573 
     574    acc = &pjsua_var.acc[acc_id]; 
     575 
     576    /* Cancel keep-alive timer, if any */ 
     577    if (acc->ka_timer.id) { 
     578        pjsip_endpt_cancel_timer(pjsua_var.endpt, &acc->ka_timer); 
     579        acc->ka_timer.id = PJ_FALSE; 
     580    } 
     581    if (acc->ka_transport) { 
     582        pjsip_transport_dec_ref(acc->ka_transport); 
     583        acc->ka_transport = NULL; 
     584    } 
     585 
    572586    /* Cancel any re-registration timer */ 
    573     pjsua_cancel_timer(&pjsua_var.acc[acc_id].auto_rereg.timer); 
     587    pjsua_cancel_timer(&acc->auto_rereg.timer); 
    574588 
    575589    /* Delete registration */ 
    576     if (pjsua_var.acc[acc_id].regc != NULL) { 
     590    if (acc->regc != NULL) { 
    577591        pjsua_acc_set_registration(acc_id, PJ_FALSE); 
    578         if (pjsua_var.acc[acc_id].regc) { 
    579             pjsip_regc_destroy(pjsua_var.acc[acc_id].regc); 
    580         } 
    581         pjsua_var.acc[acc_id].regc = NULL; 
     592        if (acc->regc) { 
     593            pjsip_regc_destroy(acc->regc); 
     594        } 
     595        acc->regc = NULL; 
    582596    } 
    583597 
     
    586600 
    587601    /* Release account pool */ 
    588     if (pjsua_var.acc[acc_id].pool) { 
    589         pj_pool_release(pjsua_var.acc[acc_id].pool); 
    590         pjsua_var.acc[acc_id].pool = NULL; 
     602    if (acc->pool) { 
     603        pj_pool_release(acc->pool); 
     604        acc->pool = NULL; 
    591605    } 
    592606 
    593607    /* Invalidate */ 
    594     pjsua_var.acc[acc_id].valid = PJ_FALSE; 
    595     pjsua_var.acc[acc_id].contact.slen = 0; 
     608    acc->valid = PJ_FALSE; 
     609    acc->contact.slen = 0; 
    596610 
    597611    /* Remove from array */ 
     
    838852    acc->cfg.timer_setting = cfg->timer_setting; 
    839853 
    840     /* Transport and keep-alive */ 
     854    /* Transport */ 
    841855    if (acc->cfg.transport_id != cfg->transport_id) { 
    842856        acc->cfg.transport_id = cfg->transport_id; 
    843857        update_reg = PJ_TRUE; 
    844858    } 
    845     acc->cfg.ka_interval = cfg->ka_interval; 
     859 
     860    /* Update keep-alive */ 
     861    if (acc->cfg.ka_interval != cfg->ka_interval || 
     862        pj_strcmp(&acc->cfg.ka_data, &cfg->ka_data)) 
     863    { 
     864        pjsip_transport *ka_transport = acc->ka_transport; 
     865 
     866        if (acc->ka_timer.id) { 
     867            pjsip_endpt_cancel_timer(pjsua_var.endpt, &acc->ka_timer); 
     868            acc->ka_timer.id = PJ_FALSE; 
     869        } 
     870        if (acc->ka_transport) { 
     871            pjsip_transport_dec_ref(acc->ka_transport); 
     872            acc->ka_transport = NULL; 
     873        } 
     874 
     875        acc->cfg.ka_interval = cfg->ka_interval; 
     876 
     877        if (cfg->ka_interval) { 
     878            if (ka_transport) { 
     879                /* Keep-alive has been running so we can just restart it */ 
     880                pj_time_val delay; 
     881 
     882                pjsip_transport_add_ref(ka_transport); 
     883                acc->ka_transport = ka_transport; 
     884 
     885                acc->ka_timer.cb = &keep_alive_timer_cb; 
     886                acc->ka_timer.user_data = (void*)acc; 
     887 
     888                delay.sec = acc->cfg.ka_interval; 
     889                delay.msec = 0; 
     890                status = pjsua_schedule_timer(&acc->ka_timer, &delay); 
     891                if (status == PJ_SUCCESS) { 
     892                    acc->ka_timer.id = PJ_TRUE; 
     893                } else { 
     894                    pjsip_transport_dec_ref(ka_transport); 
     895                    acc->ka_transport = NULL; 
     896                    pjsua_perror(THIS_FILE, "Error starting keep-alive timer", 
     897                                 status); 
     898                } 
     899 
     900            } else { 
     901                /* Keep-alive has not been running, we need to (re)register 
     902                 * first. 
     903                 */ 
     904                update_reg = PJ_TRUE; 
     905            } 
     906        } 
     907    } 
     908 
    846909    if (pj_strcmp(&acc->cfg.ka_data, &cfg->ka_data)) 
    847910        pj_strdup(acc->pool, &acc->cfg.ka_data, &cfg->ka_data); 
     
    15271590    } 
    15281591 
     1592    /* Check just in case keep-alive has been disabled. This shouldn't happen 
     1593     * though as when ka_interval is changed this timer should have been 
     1594     * cancelled. 
     1595     */ 
     1596    if (acc->cfg.ka_interval == 0) 
     1597        goto on_return; 
     1598 
    15291599    /* Reschedule next timer */ 
    15301600    delay.sec = acc->cfg.ka_interval; 
     
    15371607    } 
    15381608 
     1609on_return: 
    15391610    PJSUA_UNLOCK(); 
    15401611} 
Note: See TracChangeset for help on using the changeset viewer.