Changeset 2127


Ignore:
Timestamp:
Jul 12, 2008 9:10:25 PM (11 years ago)
Author:
bennylp
Message:

Fixed ticket #529: memory leak on Symbian and possibly handle leaks on all platforms when application quits while transactions have not been terminated

Location:
pjproject/trunk/pjsip/src/pjsip
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_endpoint.c

    r2039 r2127  
    106106static pj_status_t endpt_on_tx_msg( pjsip_endpoint *endpt, 
    107107                                    pjsip_tx_data *tdata ); 
     108static pj_status_t unload_module(pjsip_endpoint *endpt, 
     109                                 pjsip_module *mod); 
    108110 
    109111/* Defined in sip_parser.c */ 
     
    241243    } 
    242244 
     245    /* Unload module */ 
     246    status = unload_module(endpt, mod); 
     247 
     248on_return: 
     249    pj_rwmutex_unlock_write(endpt->mod_mutex); 
     250 
     251    if (status != PJ_SUCCESS) { 
     252        char errmsg[PJ_ERR_MSG_SIZE]; 
     253 
     254        pj_strerror(status, errmsg, sizeof(errmsg)); 
     255        PJ_LOG(3,(THIS_FILE, "Module \"%.*s\" can not be unregistered: %s", 
     256                  (int)mod->name.slen, mod->name.ptr, errmsg)); 
     257    } 
     258 
     259    return status; 
     260} 
     261 
     262static pj_status_t unload_module(pjsip_endpoint *endpt, 
     263                                 pjsip_module *mod) 
     264{ 
     265    pj_status_t status; 
     266 
    243267    /* Try to unload the module. */ 
    244268    if (mod->unload) { 
    245269        status = (*mod->unload)(); 
    246         if (status != PJ_SUCCESS) goto on_return; 
     270        if (status != PJ_SUCCESS)  
     271            return status; 
    247272    } 
    248273 
     
    264289    PJ_LOG(4,(THIS_FILE, "Module \"%.*s\" unregistered",  
    265290              (int)mod->name.slen, mod->name.ptr)); 
    266  
    267 on_return: 
    268     pj_rwmutex_unlock_write(endpt->mod_mutex); 
    269  
    270     if (status != PJ_SUCCESS) { 
    271         char errmsg[PJ_ERR_MSG_SIZE]; 
    272  
    273         pj_strerror(status, errmsg, sizeof(errmsg)); 
    274         PJ_LOG(3,(THIS_FILE, "Module \"%.*s\" can not be unregistered: %s", 
    275                   (int)mod->name.slen, mod->name.ptr, errmsg)); 
    276     } 
    277291 
    278292    return status; 
     
    553567    PJ_LOG(5, (THIS_FILE, "Destroying endpoing instance..")); 
    554568 
    555     /* Unregister modules. */ 
     569    /* Phase 1: stop all modules */ 
    556570    mod = endpt->module_list.prev; 
    557571    while (mod != &endpt->module_list) { 
    558572        pjsip_module *prev = mod->prev; 
    559         pjsip_endpt_unregister_module(endpt, mod); 
     573        if (mod->stop) { 
     574            (*mod->stop)(); 
     575        } 
     576        mod = prev; 
     577    } 
     578 
     579    /* Phase 2: unload modules. */ 
     580    mod = endpt->module_list.prev; 
     581    while (mod != &endpt->module_list) { 
     582        pjsip_module *prev = mod->prev; 
     583        unload_module(endpt, mod); 
    560584        mod = prev; 
    561585    } 
  • pjproject/trunk/pjsip/src/pjsip/sip_transaction.c

    r2039 r2127  
    678678        pj_hash_iterator_t *next = pj_hash_next(mod_tsx_layer.htable, it); 
    679679        if (tsx) { 
     680            pjsip_tsx_terminate(tsx, PJSIP_SC_SERVICE_UNAVAILABLE); 
    680681            mod_tsx_layer_unregister_tsx(tsx); 
    681682            tsx_destroy(tsx); 
Note: See TracChangeset for help on using the changeset viewer.