diff options
author | Benny Prijono <bennylp@teluu.com> | 2008-07-13 12:24:55 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2008-07-13 12:24:55 +0000 |
commit | 003ffd64e31edf3dc3e087e51a6ce33228563386 (patch) | |
tree | 868deffeddad19017f096038f2e616a3d4d762f8 /pjsip/src/pjsua-lib/pjsua_acc.c | |
parent | 5eb9f56603532619c4719626f580c4b9cdfd3e10 (diff) |
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
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2130 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_acc.c')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index ac6d6171..008c439e 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -108,7 +108,7 @@ static pj_status_t initialize_acc(unsigned acc_id) /* Need to parse local_uri to get the elements: */ name_addr = (pjsip_name_addr*) - pjsip_parse_uri(pjsua_var.pool, acc_cfg->id.ptr, + pjsip_parse_uri(acc->pool, acc_cfg->id.ptr, acc_cfg->id.slen, PJSIP_PARSE_URI_AS_NAMEADDR); if (name_addr == NULL) { @@ -136,7 +136,7 @@ static pj_status_t initialize_acc(unsigned acc_id) if (acc_cfg->reg_uri.slen) { pjsip_uri *reg_uri; - reg_uri = pjsip_parse_uri(pjsua_var.pool, acc_cfg->reg_uri.ptr, + reg_uri = pjsip_parse_uri(acc->pool, acc_cfg->reg_uri.ptr, acc_cfg->reg_uri.slen, 0); if (reg_uri == NULL) { pjsua_perror(THIS_FILE, "Invalid registrar URI", @@ -187,10 +187,10 @@ static pj_status_t initialize_acc(unsigned acc_id) pjsip_route_hdr *r; pj_str_t tmp; - pj_strdup_with_null(pjsua_var.pool, &tmp, + pj_strdup_with_null(acc->pool, &tmp, &pjsua_var.ua_cfg.outbound_proxy[i]); r = (pjsip_route_hdr*) - pjsip_parse_hdr(pjsua_var.pool, &hname, tmp.ptr, tmp.slen, NULL); + pjsip_parse_hdr(acc->pool, &hname, tmp.ptr, tmp.slen, NULL); if (r == NULL) { pjsua_perror(THIS_FILE, "Invalid outbound proxy URI", PJSIP_EINVALIDURI); @@ -204,9 +204,9 @@ static pj_status_t initialize_acc(unsigned acc_id) pjsip_route_hdr *r; pj_str_t tmp; - pj_strdup_with_null(pjsua_var.pool, &tmp, &acc_cfg->proxy[i]); + pj_strdup_with_null(acc->pool, &tmp, &acc_cfg->proxy[i]); r = (pjsip_route_hdr*) - pjsip_parse_hdr(pjsua_var.pool, &hname, tmp.ptr, tmp.slen, NULL); + pjsip_parse_hdr(acc->pool, &hname, tmp.ptr, tmp.slen, NULL); if (r == NULL) { pjsua_perror(THIS_FILE, "Invalid URI in account route set", PJ_EINVAL); @@ -256,6 +256,7 @@ PJ_DEF(pj_status_t) pjsua_acc_add( const pjsua_acc_config *cfg, pj_bool_t is_default, pjsua_acc_id *p_acc_id) { + pjsua_acc *acc; unsigned id; pj_status_t status; @@ -277,8 +278,16 @@ PJ_DEF(pj_status_t) pjsua_acc_add( const pjsua_acc_config *cfg, PJ_ASSERT_ON_FAIL( id < PJ_ARRAY_SIZE(pjsua_var.acc), {PJSUA_UNLOCK(); return PJ_EBUG;}); + acc = &pjsua_var.acc[id]; + + /* Create pool for this account. */ + if (acc->pool) + pj_pool_reset(acc->pool); + else + acc->pool = pjsua_pool_create("acc%p", 512, 256); + /* Copy config */ - pjsua_acc_config_dup(pjsua_var.pool, &pjsua_var.acc[id].cfg, cfg); + pjsua_acc_config_dup(acc->pool, &pjsua_var.acc[id].cfg, cfg); /* Normalize registration timeout */ if (pjsua_var.acc[id].cfg.reg_uri.slen && @@ -290,6 +299,8 @@ PJ_DEF(pj_status_t) pjsua_acc_add( const pjsua_acc_config *cfg, status = initialize_acc(id); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error adding account", status); + pj_pool_release(acc->pool); + acc->pool = NULL; PJSUA_UNLOCK(); return status; } @@ -399,6 +410,12 @@ PJ_DEF(pj_status_t) pjsua_acc_del(pjsua_acc_id acc_id) /* Delete server presence subscription */ pjsua_pres_delete_acc(acc_id); + /* Release account pool */ + if (pjsua_var.acc[acc_id].pool) { + pj_pool_release(pjsua_var.acc[acc_id].pool); + pjsua_var.acc[acc_id].pool = NULL; + } + /* Invalidate */ pjsua_var.acc[acc_id].valid = PJ_FALSE; @@ -471,8 +488,11 @@ PJ_DEF(pj_status_t) pjsua_acc_set_online_status2( pjsua_acc_id acc_id, PJ_EINVAL); PJ_ASSERT_RETURN(pjsua_var.acc[acc_id].valid, PJ_EINVALIDOP); + PJSUA_LOCK(); pjsua_var.acc[acc_id].online_status = is_online; - pjrpid_element_dup(pjsua_var.pool, &pjsua_var.acc[acc_id].rpid, pr); + pjrpid_element_dup(pjsua_var.acc[acc_id].pool, &pjsua_var.acc[acc_id].rpid, pr); + PJSUA_UNLOCK(); + pjsua_pres_update_acc(acc_id, PJ_TRUE); return PJ_SUCCESS; } @@ -594,7 +614,7 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc, pj_pool_release(pool); return PJ_FALSE; } - pj_strdup2(pjsua_var.pool, &acc->contact, tmp); + pj_strdup2(acc->pool, &acc->contact, tmp); } /* For UDP transport, if STUN is enabled then update the transport's @@ -702,8 +722,8 @@ void update_service_route(pjsua_acc *acc, pjsip_rx_data *rdata) /* Then append the Service-Route URIs */ for (i=0; i<uri_cnt; ++i) { - hr = pjsip_route_hdr_create(pjsua_var.pool); - hr->name_addr.uri = (pjsip_uri*)pjsip_uri_clone(pjsua_var.pool, uri[i]); + hr = pjsip_route_hdr_create(acc->pool); + hr->name_addr.uri = (pjsip_uri*)pjsip_uri_clone(acc->pool, uri[i]); pj_list_push_back(&acc->route_set, hr); } @@ -982,7 +1002,7 @@ static pj_status_t pjsua_regc_init(int acc_id) return status; } - pj_strdup_with_null(pjsua_var.pool, &acc->contact, &tmp_contact); + pj_strdup_with_null(acc->pool, &acc->contact, &tmp_contact); } status = pjsip_regc_init( acc->regc, @@ -1267,16 +1287,18 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_outgoing(const pj_str_t *url) pj_str_t tmp; pjsip_uri *uri; pjsip_sip_uri *sip_uri; + pj_pool_t *tmp_pool; unsigned i; PJSUA_LOCK(); - PJ_TODO(dont_use_pjsua_pool); + tmp_pool = pjsua_pool_create("tmpacc10", 256, 256); - pj_strdup_with_null(pjsua_var.pool, &tmp, url); + pj_strdup_with_null(tmp_pool, &tmp, url); - uri = pjsip_parse_uri(pjsua_var.pool, tmp.ptr, tmp.slen, 0); + uri = pjsip_parse_uri(tmp_pool, tmp.ptr, tmp.slen, 0); if (!uri) { + pj_pool_release(tmp_pool); PJSUA_UNLOCK(); return pjsua_var.default_acc; } @@ -1294,11 +1316,13 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_outgoing(const pj_str_t *url) if (i != PJ_ARRAY_SIZE(pjsua_var.acc)) { /* Found rather matching account */ + pj_pool_release(tmp_pool); PJSUA_UNLOCK(); - return 0; + return i; } /* Not found, use default account */ + pj_pool_release(tmp_pool); PJSUA_UNLOCK(); return pjsua_var.default_acc; } @@ -1311,6 +1335,7 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_outgoing(const pj_str_t *url) if (pj_stricmp(&pjsua_var.acc[acc_id].srv_domain, &sip_uri->host)==0 && pjsua_var.acc[acc_id].srv_port == sip_uri->port) { + pj_pool_release(tmp_pool); PJSUA_UNLOCK(); return acc_id; } @@ -1321,6 +1346,7 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_outgoing(const pj_str_t *url) unsigned acc_id = pjsua_var.acc_ids[i]; if (pj_stricmp(&pjsua_var.acc[acc_id].srv_domain, &sip_uri->host)==0) { + pj_pool_release(tmp_pool); PJSUA_UNLOCK(); return acc_id; } @@ -1328,6 +1354,7 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_outgoing(const pj_str_t *url) /* Still no match, just use default account */ + pj_pool_release(tmp_pool); PJSUA_UNLOCK(); return pjsua_var.default_acc; } |