Ignore:
Timestamp:
Aug 12, 2009 5:53:47 PM (15 years ago)
Author:
bennylp
Message:

Ticket #877: Memory consumption of the invite session grows indefinitely if call is running for long period of time and with many re-INVITES

  • introducing flip-flop pools in the pjsip_inv_session. There are two additional pools created, and one of them will be reset everytime SDP negotiation is done to release memory back to the OS
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r2861 r2869  
    7878}; 
    7979 
     80#define POOL_INIT_SIZE  256 
     81#define POOL_INC_SIZE   256 
     82 
    8083/* 
    8184 * Static prototypes. 
     
    235238        pjsip_timer_end_session(inv); 
    236239        pjsip_dlg_dec_session(inv->dlg, &mod_inv.mod); 
     240 
     241        /* Release the flip-flop pools */ 
     242        pj_pool_release(inv->pool_prov); 
     243        pj_pool_release(inv->pool_active); 
    237244    } 
    238245} 
     
    670677    inv->cause = (pjsip_status_code) 0; 
    671678 
     679    /* Create flip-flop pool (see ticket #877) */ 
     680    /* (using inv->obj_name as temporary variable for pool names */ 
     681    pj_ansi_snprintf(inv->obj_name, PJ_MAX_OBJ_NAME, "inv%p", dlg->pool); 
     682    inv->pool_prov = pjsip_endpt_create_pool(dlg->endpt, inv->obj_name, 
     683                                             POOL_INIT_SIZE, POOL_INC_SIZE); 
     684    inv->pool_active = pjsip_endpt_create_pool(dlg->endpt, inv->obj_name, 
     685                                               POOL_INIT_SIZE, POOL_INC_SIZE); 
     686 
    672687    /* Object name will use the same dialog pointer. */ 
    673688    pj_ansi_snprintf(inv->obj_name, PJ_MAX_OBJ_NAME, "inv%p", dlg); 
     
    675690    /* Create negotiator if local_sdp is specified. */ 
    676691    if (local_sdp) { 
    677         status = pjmedia_sdp_neg_create_w_local_offer(dlg->pool, local_sdp, 
    678                                                       &inv->neg); 
     692        status = pjmedia_sdp_neg_create_w_local_offer(inv->pool,  
     693                                                      local_sdp, &inv->neg); 
    679694        if (status != PJ_SUCCESS) { 
    680695            pjsip_dlg_dec_lock(dlg); 
     
    11301145    inv->cause = (pjsip_status_code) 0; 
    11311146 
     1147    /* Create flip-flop pool (see ticket #877) */ 
     1148    /* (using inv->obj_name as temporary variable for pool names */ 
     1149    pj_ansi_snprintf(inv->obj_name, PJ_MAX_OBJ_NAME, "inv%p", dlg->pool); 
     1150    inv->pool_prov = pjsip_endpt_create_pool(dlg->endpt, inv->obj_name, 
     1151                                             POOL_INIT_SIZE, POOL_INC_SIZE); 
     1152    inv->pool_active = pjsip_endpt_create_pool(dlg->endpt, inv->obj_name, 
     1153                                               POOL_INIT_SIZE, POOL_INC_SIZE); 
     1154 
    11321155    /* Object name will use the same dialog pointer. */ 
    11331156    pj_ansi_snprintf(inv->obj_name, PJ_MAX_OBJ_NAME, "inv%p", dlg); 
     
    11511174    /* Create negotiator. */ 
    11521175    if (rem_sdp) { 
    1153         status = pjmedia_sdp_neg_create_w_remote_offer(inv->pool, local_sdp, 
    1154                                                        rem_sdp, &inv->neg); 
     1176        status = pjmedia_sdp_neg_create_w_remote_offer(inv->pool,  
     1177                                                       local_sdp, rem_sdp,  
     1178                                                       &inv->neg); 
    11551179                                                 
    11561180    } else if (local_sdp) { 
    1157         status = pjmedia_sdp_neg_create_w_local_offer(inv->pool, local_sdp, 
    1158                                                       &inv->neg); 
     1181        status = pjmedia_sdp_neg_create_w_local_offer(inv->pool,  
     1182                                                      local_sdp, &inv->neg); 
    11591183    } else { 
    11601184        status = PJ_SUCCESS; 
     
    14401464 
    14411465 
     1466/* Util: swap pool */ 
     1467static void swap_pool(pj_pool_t **p1, pj_pool_t **p2) 
     1468{ 
     1469    pj_pool_t *tmp = *p1; 
     1470    *p1 = *p2; 
     1471    *p2 = tmp; 
     1472} 
     1473 
    14421474/* 
    14431475 * Initiate SDP negotiation in the SDP negotiator. 
     
    14511483                     PJMEDIA_SDPNEG_EINSTATE); 
    14521484 
    1453     status = pjmedia_sdp_neg_negotiate(inv->pool, inv->neg, 0); 
     1485    status = pjmedia_sdp_neg_negotiate(inv->pool_prov, inv->neg, 0); 
    14541486 
    14551487    PJ_LOG(5,(inv->obj_name, "SDP negotiation done, status=%d", status)); 
     
    14571489    if (mod_inv.cb.on_media_update && inv->notify) 
    14581490        (*mod_inv.cb.on_media_update)(inv, status); 
     1491 
     1492    /* Swap the flip-flop pool, and reset the new provisional pool */ 
     1493    swap_pool(&inv->pool_prov, &inv->pool_active); 
     1494    pj_pool_reset(inv->pool_prov); 
    14591495 
    14601496    return status; 
     
    15351571 
    15361572            /* Feed the original offer to negotiator */ 
    1537             status = pjmedia_sdp_neg_modify_local_offer(inv->pool, inv->neg, 
     1573            status = pjmedia_sdp_neg_modify_local_offer(inv->pool_prov,  
     1574                                                        inv->neg, 
    15381575                                                        reoffer_sdp); 
    15391576            if (status != PJ_SUCCESS) { 
     
    15811618 
    15821619        if (inv->neg == NULL) { 
    1583             status=pjmedia_sdp_neg_create_w_remote_offer(inv->pool, NULL,  
     1620            status=pjmedia_sdp_neg_create_w_remote_offer(inv->pool, NULL, 
    15841621                                                         rem_sdp, &inv->neg); 
    15851622        } else { 
    1586             status=pjmedia_sdp_neg_set_remote_offer(inv->pool, inv->neg,  
     1623            status=pjmedia_sdp_neg_set_remote_offer(inv->pool_prov, inv->neg,  
    15871624                                                    rem_sdp); 
    15881625        } 
     
    16161653                  pjsip_rx_data_get_info(rdata))); 
    16171654 
    1618         status = pjmedia_sdp_neg_set_remote_answer(inv->pool, inv->neg,  
     1655        status = pjmedia_sdp_neg_set_remote_answer(inv->pool_prov, inv->neg, 
    16191656                                                   rem_sdp); 
    16201657 
     
    16691706 
    16701707        if (inv->neg == NULL) { 
    1671             status = pjmedia_sdp_neg_create_w_local_offer(inv->pool, local_sdp, 
     1708            status = pjmedia_sdp_neg_create_w_local_offer(inv->pool,  
     1709                                                          local_sdp, 
    16721710                                                          &inv->neg); 
    16731711        } else if (pjmedia_sdp_neg_get_state(inv->neg)== 
    16741712                   PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER) 
    16751713        { 
    1676             status = pjmedia_sdp_neg_set_local_answer(inv->pool, inv->neg, 
     1714            status = pjmedia_sdp_neg_set_local_answer(inv->pool_prov, inv->neg, 
    16771715                                                      local_sdp); 
    16781716        } else { 
     
    18791917 
    18801918    pjsip_dlg_inc_lock(inv->dlg); 
    1881     status = pjmedia_sdp_neg_set_local_answer( inv->pool, inv->neg, sdp); 
     1919    status = pjmedia_sdp_neg_set_local_answer( inv->pool_prov, inv->neg, sdp); 
    18821920    pjsip_dlg_dec_lock(inv->dlg); 
    18831921 
     
    22282266    if (new_offer) { 
    22292267        if (!inv->neg) { 
    2230             status = pjmedia_sdp_neg_create_w_local_offer(inv->pool, new_offer, 
     2268            status = pjmedia_sdp_neg_create_w_local_offer(inv->pool,  
     2269                                                          new_offer, 
    22312270                                                          &inv->neg); 
    22322271            if (status != PJ_SUCCESS) 
     
    22472286 
    22482287            case PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER: 
    2249                 status = pjmedia_sdp_neg_set_local_answer(inv->pool, inv->neg, 
     2288                status = pjmedia_sdp_neg_set_local_answer(inv->pool_prov,  
     2289                                                          inv->neg, 
    22502290                                                          new_offer); 
    22512291                if (status != PJ_SUCCESS) 
     
    22602300 
    22612301            case PJMEDIA_SDP_NEG_STATE_DONE: 
    2262                 status = pjmedia_sdp_neg_modify_local_offer(inv->pool,inv->neg, 
     2302                status = pjmedia_sdp_neg_modify_local_offer(inv->pool_prov, 
     2303                                                            inv->neg, 
    22632304                                                            new_offer); 
    22642305                if (status != PJ_SUCCESS) 
     
    23162357     * with correct SDP origin. 
    23172358     */ 
    2318     status = pjmedia_sdp_neg_modify_local_offer(inv->pool,inv->neg, 
     2359    status = pjmedia_sdp_neg_modify_local_offer(inv->pool_prov, inv->neg, 
    23192360                                                offer); 
    23202361    if (status != PJ_SUCCESS) 
     
    37453786                         * fix the offer with correct SDP origin. 
    37463787                         */ 
    3747                         status = pjmedia_sdp_neg_modify_local_offer(dlg->pool, 
    3748                                                                     inv->neg, 
    3749                                                                     sdp); 
     3788                        status =  
     3789                            pjmedia_sdp_neg_modify_local_offer(inv->pool_prov, 
     3790                                                               inv->neg, 
     3791                                                               sdp); 
    37503792 
    37513793                        /* Retrieve the "fixed" offer from negotiator */ 
     
    37603802                if (sdp == NULL) { 
    37613803                    const pjmedia_sdp_session *active_sdp = NULL; 
    3762                     status = pjmedia_sdp_neg_send_local_offer(dlg->pool,  
     3804                    status = pjmedia_sdp_neg_send_local_offer(inv->pool_prov, 
    37633805                                                              inv->neg,  
    37643806                                                              &active_sdp); 
Note: See TracChangeset for help on using the changeset viewer.