Ignore:
Timestamp:
Jul 13, 2008 12:24:55 PM (16 years ago)
Author:
bennylp
Message:

Ticket #518: some fixes for growing memory usage in PJSUA-LIB, by using temporary pools for temporary variables and by having separate pool for each account and buddy

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r2039 r2130  
    109109 
    110110    name_addr = (pjsip_name_addr*) 
    111                     pjsip_parse_uri(pjsua_var.pool, acc_cfg->id.ptr, 
     111                    pjsip_parse_uri(acc->pool, acc_cfg->id.ptr, 
    112112                                    acc_cfg->id.slen,  
    113113                                    PJSIP_PARSE_URI_AS_NAMEADDR); 
     
    137137        pjsip_uri *reg_uri; 
    138138 
    139         reg_uri = pjsip_parse_uri(pjsua_var.pool, acc_cfg->reg_uri.ptr, 
     139        reg_uri = pjsip_parse_uri(acc->pool, acc_cfg->reg_uri.ptr, 
    140140                                  acc_cfg->reg_uri.slen, 0); 
    141141        if (reg_uri == NULL) { 
     
    188188        pj_str_t tmp; 
    189189 
    190         pj_strdup_with_null(pjsua_var.pool, &tmp,  
     190        pj_strdup_with_null(acc->pool, &tmp,  
    191191                            &pjsua_var.ua_cfg.outbound_proxy[i]); 
    192192        r = (pjsip_route_hdr*) 
    193             pjsip_parse_hdr(pjsua_var.pool, &hname, tmp.ptr, tmp.slen, NULL); 
     193            pjsip_parse_hdr(acc->pool, &hname, tmp.ptr, tmp.slen, NULL); 
    194194        if (r == NULL) { 
    195195            pjsua_perror(THIS_FILE, "Invalid outbound proxy URI", 
     
    205205        pj_str_t tmp; 
    206206 
    207         pj_strdup_with_null(pjsua_var.pool, &tmp, &acc_cfg->proxy[i]); 
     207        pj_strdup_with_null(acc->pool, &tmp, &acc_cfg->proxy[i]); 
    208208        r = (pjsip_route_hdr*) 
    209             pjsip_parse_hdr(pjsua_var.pool, &hname, tmp.ptr, tmp.slen, NULL); 
     209            pjsip_parse_hdr(acc->pool, &hname, tmp.ptr, tmp.slen, NULL); 
    210210        if (r == NULL) { 
    211211            pjsua_perror(THIS_FILE, "Invalid URI in account route set", 
     
    257257                                   pjsua_acc_id *p_acc_id) 
    258258{ 
     259    pjsua_acc *acc; 
    259260    unsigned id; 
    260261    pj_status_t status; 
     
    278279                        {PJSUA_UNLOCK(); return PJ_EBUG;}); 
    279280 
     281    acc = &pjsua_var.acc[id]; 
     282 
     283    /* Create pool for this account. */ 
     284    if (acc->pool) 
     285        pj_pool_reset(acc->pool); 
     286    else 
     287        acc->pool = pjsua_pool_create("acc%p", 512, 256); 
     288 
    280289    /* Copy config */ 
    281     pjsua_acc_config_dup(pjsua_var.pool, &pjsua_var.acc[id].cfg, cfg); 
     290    pjsua_acc_config_dup(acc->pool, &pjsua_var.acc[id].cfg, cfg); 
    282291     
    283292    /* Normalize registration timeout */ 
     
    291300    if (status != PJ_SUCCESS) { 
    292301        pjsua_perror(THIS_FILE, "Error adding account", status); 
     302        pj_pool_release(acc->pool); 
     303        acc->pool = NULL; 
    293304        PJSUA_UNLOCK(); 
    294305        return status; 
     
    400411    pjsua_pres_delete_acc(acc_id); 
    401412 
     413    /* Release account pool */ 
     414    if (pjsua_var.acc[acc_id].pool) { 
     415        pj_pool_release(pjsua_var.acc[acc_id].pool); 
     416        pjsua_var.acc[acc_id].pool = NULL; 
     417    } 
     418 
    402419    /* Invalidate */ 
    403420    pjsua_var.acc[acc_id].valid = PJ_FALSE; 
     
    472489    PJ_ASSERT_RETURN(pjsua_var.acc[acc_id].valid, PJ_EINVALIDOP); 
    473490 
     491    PJSUA_LOCK(); 
    474492    pjsua_var.acc[acc_id].online_status = is_online; 
    475     pjrpid_element_dup(pjsua_var.pool, &pjsua_var.acc[acc_id].rpid, pr); 
     493    pjrpid_element_dup(pjsua_var.acc[acc_id].pool, &pjsua_var.acc[acc_id].rpid, pr); 
     494    PJSUA_UNLOCK(); 
     495 
    476496    pjsua_pres_update_acc(acc_id, PJ_TRUE); 
    477497    return PJ_SUCCESS; 
     
    595615            return PJ_FALSE; 
    596616        } 
    597         pj_strdup2(pjsua_var.pool, &acc->contact, tmp); 
     617        pj_strdup2(acc->pool, &acc->contact, tmp); 
    598618    } 
    599619 
     
    703723    /* Then append the Service-Route URIs */ 
    704724    for (i=0; i<uri_cnt; ++i) { 
    705         hr = pjsip_route_hdr_create(pjsua_var.pool); 
    706         hr->name_addr.uri = (pjsip_uri*)pjsip_uri_clone(pjsua_var.pool, uri[i]); 
     725        hr = pjsip_route_hdr_create(acc->pool); 
     726        hr->name_addr.uri = (pjsip_uri*)pjsip_uri_clone(acc->pool, uri[i]); 
    707727        pj_list_push_back(&acc->route_set, hr); 
    708728    } 
     
    9831003        } 
    9841004 
    985         pj_strdup_with_null(pjsua_var.pool, &acc->contact, &tmp_contact); 
     1005        pj_strdup_with_null(acc->pool, &acc->contact, &tmp_contact); 
    9861006    } 
    9871007 
     
    12681288    pjsip_uri *uri; 
    12691289    pjsip_sip_uri *sip_uri; 
     1290    pj_pool_t *tmp_pool; 
    12701291    unsigned i; 
    12711292 
    12721293    PJSUA_LOCK(); 
    12731294 
    1274     PJ_TODO(dont_use_pjsua_pool); 
    1275  
    1276     pj_strdup_with_null(pjsua_var.pool, &tmp, url); 
    1277  
    1278     uri = pjsip_parse_uri(pjsua_var.pool, tmp.ptr, tmp.slen, 0); 
     1295    tmp_pool = pjsua_pool_create("tmpacc10", 256, 256); 
     1296 
     1297    pj_strdup_with_null(tmp_pool, &tmp, url); 
     1298 
     1299    uri = pjsip_parse_uri(tmp_pool, tmp.ptr, tmp.slen, 0); 
    12791300    if (!uri) { 
     1301        pj_pool_release(tmp_pool); 
    12801302        PJSUA_UNLOCK(); 
    12811303        return pjsua_var.default_acc; 
     
    12951317        if (i != PJ_ARRAY_SIZE(pjsua_var.acc)) { 
    12961318            /* Found rather matching account */ 
     1319            pj_pool_release(tmp_pool); 
    12971320            PJSUA_UNLOCK(); 
    1298             return 0; 
     1321            return i; 
    12991322        } 
    13001323 
    13011324        /* Not found, use default account */ 
     1325        pj_pool_release(tmp_pool); 
    13021326        PJSUA_UNLOCK(); 
    13031327        return pjsua_var.default_acc; 
     
    13121336            pjsua_var.acc[acc_id].srv_port == sip_uri->port) 
    13131337        { 
     1338            pj_pool_release(tmp_pool); 
    13141339            PJSUA_UNLOCK(); 
    13151340            return acc_id; 
     
    13221347        if (pj_stricmp(&pjsua_var.acc[acc_id].srv_domain, &sip_uri->host)==0) 
    13231348        { 
     1349            pj_pool_release(tmp_pool); 
    13241350            PJSUA_UNLOCK(); 
    13251351            return acc_id; 
     
    13291355 
    13301356    /* Still no match, just use default account */ 
     1357    pj_pool_release(tmp_pool); 
    13311358    PJSUA_UNLOCK(); 
    13321359    return pjsua_var.default_acc; 
Note: See TracChangeset for help on using the changeset viewer.