Ignore:
Timestamp:
Jul 13, 2008 12:24:55 PM (14 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_pres.c

    r2118 r2130  
    174174static void reset_buddy(pjsua_buddy_id id) 
    175175{ 
     176    pj_pool_t *pool = pjsua_var.buddy[id].pool; 
    176177    pj_bzero(&pjsua_var.buddy[id], sizeof(pjsua_var.buddy[id])); 
     178    pjsua_var.buddy[id].pool = pool; 
    177179    pjsua_var.buddy[id].index = id; 
    178180} 
     
    186188{ 
    187189    pjsip_name_addr *url; 
     190    pjsua_buddy *buddy; 
    188191    pjsip_sip_uri *sip_uri; 
    189192    int index; 
     
    210213    } 
    211214 
     215    buddy = &pjsua_var.buddy[index]; 
     216 
     217    /* Create pool for this buddy */ 
     218    if (buddy->pool) { 
     219        pj_pool_reset(buddy->pool); 
     220    } else { 
     221        char name[PJ_MAX_OBJ_NAME]; 
     222        pj_ansi_snprintf(name, sizeof(name), "buddy%03d", index); 
     223        buddy->pool = pjsua_pool_create(name, 512, 256); 
     224    } 
    212225 
    213226    /* Get name and display name for buddy */ 
    214     pj_strdup_with_null(pjsua_var.pool, &tmp, &cfg->uri); 
    215     url = (pjsip_name_addr*)pjsip_parse_uri(pjsua_var.pool, tmp.ptr, tmp.slen, 
     227    pj_strdup_with_null(buddy->pool, &tmp, &cfg->uri); 
     228    url = (pjsip_name_addr*)pjsip_parse_uri(buddy->pool, tmp.ptr, tmp.slen, 
    216229                                            PJSIP_PARSE_URI_AS_NAMEADDR); 
    217230 
    218231    if (url == NULL) { 
    219232        pjsua_perror(THIS_FILE, "Unable to add buddy", PJSIP_EINVALIDURI); 
     233        pj_pool_release(buddy->pool); 
     234        buddy->pool = NULL; 
    220235        PJSUA_UNLOCK(); 
    221236        return PJSIP_EINVALIDURI; 
     
    223238 
    224239    /* Only support SIP schemes */ 
    225     if (!PJSIP_URI_SCHEME_IS_SIP(url) && !PJSIP_URI_SCHEME_IS_SIPS(url)) 
     240    if (!PJSIP_URI_SCHEME_IS_SIP(url) && !PJSIP_URI_SCHEME_IS_SIPS(url)) { 
     241        pj_pool_release(buddy->pool); 
     242        buddy->pool = NULL; 
     243        PJSUA_UNLOCK(); 
    226244        return PJSIP_EINVALIDSCHEME; 
     245    } 
    227246 
    228247    /* Reset buddy, to make sure everything is cleared with default 
     
    10501069 
    10511070    buddy->contact.ptr = (char*) 
    1052                          pj_pool_alloc(pjsua_var.pool, PJSIP_MAX_URL_SIZE); 
     1071                         pj_pool_alloc(buddy->pool, PJSIP_MAX_URL_SIZE); 
    10531072    buddy->contact.slen = pjsip_uri_print( PJSIP_URI_IN_CONTACT_HDR, 
    10541073                                           contact_hdr->uri, 
     
    11171136static void subscribe_buddy_presence(unsigned index) 
    11181137{ 
     1138    pj_pool_t *tmp_pool = NULL; 
    11191139    pjsua_buddy *buddy; 
    11201140    int acc_id; 
     
    11381158        contact = acc->contact; 
    11391159    } else { 
    1140         status = pjsua_acc_create_uac_contact(pjsua_var.pool, &contact, 
     1160        tmp_pool = pjsua_pool_create("tmpbuddy", 512, 256); 
     1161 
     1162        status = pjsua_acc_create_uac_contact(tmp_pool, &contact, 
    11411163                                              acc_id, &buddy->uri); 
    11421164        if (status != PJ_SUCCESS) { 
    11431165            pjsua_perror(THIS_FILE, "Unable to generate Contact header",  
    11441166                         status); 
     1167            pj_pool_release(tmp_pool); 
    11451168            return; 
    11461169        } 
     
    11561179        pjsua_perror(THIS_FILE, "Unable to create dialog",  
    11571180                     status); 
     1181        if (tmp_pool) pj_pool_release(tmp_pool); 
    11581182        return; 
    11591183    } 
     
    11661190                     status); 
    11671191        pjsip_dlg_terminate(buddy->dlg); 
     1192        if (tmp_pool) pj_pool_release(tmp_pool); 
    11681193        return; 
    11691194    } 
     
    12031228        pjsua_perror(THIS_FILE, "Unable to create initial SUBSCRIBE",  
    12041229                     status); 
     1230        if (tmp_pool) pj_pool_release(tmp_pool); 
    12051231        return; 
    12061232    } 
     
    12161242        pjsua_perror(THIS_FILE, "Unable to send initial SUBSCRIBE",  
    12171243                     status); 
     1244        if (tmp_pool) pj_pool_release(tmp_pool); 
    12181245        return; 
    12191246    } 
     1247 
     1248    if (tmp_pool) pj_pool_release(tmp_pool); 
    12201249} 
    12211250 
Note: See TracChangeset for help on using the changeset viewer.