Changeset 2130


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

Location:
pjproject/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c

    r2094 r2130  
    37973797 
    37983798    /* Create pool for application */ 
    3799     app_config.pool = pjsua_pool_create("pjsua", 1000, 1000); 
     3799    app_config.pool = pjsua_pool_create("pjsua-app", 1000, 1000); 
    38003800 
    38013801    /* Initialize default config */ 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua_internal.h

    r2079 r2130  
    9999typedef struct pjsua_acc 
    100100{ 
     101    pj_pool_t       *pool;          /**< Pool for this account.         */ 
    101102    pjsua_acc_config cfg;           /**< Account configuration.         */ 
    102103    pj_bool_t        valid;         /**< Is this account valid?         */ 
     
    156157typedef struct pjsua_buddy 
    157158{ 
     159    pj_pool_t           *pool;      /**< Pool for this buddy.           */ 
    158160    unsigned             index;     /**< Buddy index.                   */ 
    159161    pj_str_t             uri;       /**< Buddy URI.                     */ 
  • 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; 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c

    r2079 r2130  
    331331                                          pjsua_call_id *p_call_id) 
    332332{ 
     333    pj_pool_t *tmp_pool; 
    333334    pjsip_dialog *dlg = NULL; 
    334335    pjmedia_sdp_session *offer; 
     
    383384    call = &pjsua_var.calls[call_id]; 
    384385 
     386    /* Create temporary pool */ 
     387    tmp_pool = pjsua_pool_create("tmpcall10", 512, 256); 
     388 
    385389    /* Verify that destination URI is valid before calling  
    386390     * pjsua_acc_create_uac_contact, or otherwise there   
     
    389393     */ 
    390394    if (1) { 
    391         pj_pool_t *pool; 
    392395        pjsip_uri *uri; 
    393396        pj_str_t dup; 
    394397 
    395         pool = pjsua_pool_create("tmp-uri", 4000, 4000); 
    396         if (!pool) { 
    397             pjsua_perror(THIS_FILE, "Unable to create pool", PJ_ENOMEM); 
    398             PJSUA_UNLOCK(); 
    399             return PJ_ENOMEM; 
    400         } 
    401          
    402         pj_strdup_with_null(pool, &dup, dest_uri); 
    403         uri = pjsip_parse_uri(pool, dup.ptr, dup.slen, 0); 
    404         pj_pool_release(pool); 
     398        pj_strdup_with_null(tmp_pool, &dup, dest_uri); 
     399        uri = pjsip_parse_uri(tmp_pool, dup.ptr, dup.slen, 0); 
    405400 
    406401        if (uri == NULL) { 
    407402            pjsua_perror(THIS_FILE, "Unable to make call",  
    408403                         PJSIP_EINVALIDREQURI); 
     404            pj_pool_release(tmp_pool); 
    409405            PJSUA_UNLOCK(); 
    410406            return PJSIP_EINVALIDREQURI; 
     
    427423        contact = acc->contact; 
    428424    } else { 
    429         status = pjsua_acc_create_uac_contact(pjsua_var.pool, &contact, 
     425        status = pjsua_acc_create_uac_contact(tmp_pool, &contact, 
    430426                                              acc_id, dest_uri); 
    431427        if (status != PJ_SUCCESS) { 
    432428            pjsua_perror(THIS_FILE, "Unable to generate Contact header",  
    433429                         status); 
     430            pj_pool_release(tmp_pool); 
    434431            PJSUA_UNLOCK(); 
    435432            return status; 
     
    443440    if (status != PJ_SUCCESS) { 
    444441        pjsua_perror(THIS_FILE, "Dialog creation failed", status); 
     442        pj_pool_release(tmp_pool); 
    445443        PJSUA_UNLOCK(); 
    446444        return status; 
     
    550548        *p_call_id = call_id; 
    551549 
     550    pj_pool_release(tmp_pool); 
    552551    PJSUA_UNLOCK(); 
    553552 
     
    567566    } 
    568567 
     568    pj_pool_release(tmp_pool); 
    569569    PJSUA_UNLOCK(); 
    570570    return status; 
     
    26182618{ 
    26192619    pj_status_t status; 
     2620    pj_pool_t *pool; 
    26202621    pjmedia_sdp_conn *conn; 
    26212622    pjmedia_sdp_attr *attr; 
     
    26232624    pjmedia_sdp_session *sdp; 
    26242625 
     2626    /* Use call's pool */ 
     2627    pool = call->inv->pool; 
     2628 
    26252629    /* Get media socket info */ 
    26262630    pjmedia_transport_info_init(&tp_info); 
     
    26282632 
    26292633    /* Create new offer */ 
    2630     status = pjmedia_endpt_create_sdp(pjsua_var.med_endpt, pjsua_var.pool, 1, 
     2634    status = pjmedia_endpt_create_sdp(pjsua_var.med_endpt, pool, 1, 
    26312635                                      &tp_info.sock_info, &sdp); 
    26322636    if (status != PJ_SUCCESS) { 
     
    26502654 
    26512655    /* Add inactive attribute */ 
    2652     attr = pjmedia_sdp_attr_create(pjsua_var.pool, "inactive", NULL); 
     2656    attr = pjmedia_sdp_attr_create(pool, "inactive", NULL); 
    26532657    pjmedia_sdp_media_add_attr(sdp->media[0], attr); 
    26542658 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r2039 r2130  
    581581 
    582582    /* Create memory pool for application. */ 
    583     pjsua_var.pool = pjsua_pool_create("pjsua", 4000, 4000); 
     583    pjsua_var.pool = pjsua_pool_create("pjsua", 1000, 1000); 
    584584     
    585585    PJ_ASSERT_RETURN(pjsua_var.pool, PJ_ENOMEM); 
     
    10701070        pjsua_pres_shutdown(); 
    10711071 
    1072         /* Unregister, if required: */ 
     1072        /* Destroy pool in the buddy object */ 
     1073        for (i=0; i<(int)PJ_ARRAY_SIZE(pjsua_var.buddy); ++i) { 
     1074            if (pjsua_var.buddy[i].pool) { 
     1075                pj_pool_release(pjsua_var.buddy[i].pool); 
     1076                pjsua_var.buddy[i].pool = NULL; 
     1077            } 
     1078        } 
     1079 
     1080        /* Destroy accounts */ 
    10731081        for (i=0; i<(int)PJ_ARRAY_SIZE(pjsua_var.acc); ++i) { 
    10741082            if (!pjsua_var.acc[i].valid) 
     
    10771085            if (pjsua_var.acc[i].regc) { 
    10781086                pjsua_acc_set_registration(i, PJ_FALSE); 
     1087            } 
     1088 
     1089            if (pjsua_var.acc[i].pool) { 
     1090                pj_pool_release(pjsua_var.acc[i].pool); 
     1091                pjsua_var.acc[i].pool = NULL; 
    10791092            } 
    10801093        } 
  • 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.