void free_cell( struct cell* dead_cell ) { char *b; int i; struct sip_msg *rpl; struct totag_elem *tt, *foo; release_cell_lock( dead_cell ); shm_lock(); /* UA Server */ if ( dead_cell->uas.request ) sip_msg_free_unsafe( dead_cell->uas.request ); if ( dead_cell->uas.response.buffer ) shm_free_unsafe( dead_cell->uas.response.buffer ); /* completion callback */ if (dead_cell->cbp) shm_free_unsafe(dead_cell->cbp); /* UA Clients */ for ( i =0 ; i<dead_cell->nr_of_outgoings; i++ ) { /* retransmission buffer */ if ( (b=dead_cell->uac[i].request.buffer) ) shm_free_unsafe( b ); b=dead_cell->uac[i].local_cancel.buffer; if (b!=0 && b!=BUSY_BUFFER) shm_free_unsafe( b ); rpl=dead_cell->uac[i].reply; if (rpl && rpl!=FAKED_REPLY) { sip_msg_free_unsafe( rpl ); } } /* collected to tags */ tt=dead_cell->fwded_totags; while(tt) { foo=tt->next; shm_free_unsafe(tt->tag.s); shm_free_unsafe(tt); tt=foo; } /* the cell's body */ shm_free_unsafe( dead_cell ); shm_unlock(); }
void free_cell( struct cell* dead_cell ) { char *b; int i; struct sip_msg *rpl; struct totag_elem *tt, *foo; struct tm_callback *cbs, *cbs_tmp; release_cell_lock( dead_cell ); shm_lock(); /* UA Server */ if ( dead_cell->uas.request ) sip_msg_free_unsafe( dead_cell->uas.request ); if ( dead_cell->uas.response.buffer ) shm_free_unsafe( dead_cell->uas.response.buffer ); /* callbacks */ for( cbs=dead_cell->tmcb_hl.first ; cbs ; ) { cbs_tmp = cbs; cbs = cbs->next; shm_free_unsafe( cbs_tmp ); } /* UA Clients */ for ( i =0 ; i<dead_cell->nr_of_outgoings; i++ ) { /* retransmission buffer */ if ( (b=dead_cell->uac[i].request.buffer) ) shm_free_unsafe( b ); b=dead_cell->uac[i].local_cancel.buffer; if (b!=0 && b!=BUSY_BUFFER) shm_free_unsafe( b ); rpl=dead_cell->uac[i].reply; if (rpl && rpl!=FAKED_REPLY && rpl->msg_flags&FL_SHM_CLONE) { sip_msg_free_unsafe( rpl ); } #ifdef USE_DNS_FAILOVER if (dead_cell->uac[i].dns_h.a){ DBG("branch %d -> dns_h.srv (%.*s) ref=%d," " dns_h.a (%.*s) ref=%d\n", i, dead_cell->uac[i].dns_h.srv? dead_cell->uac[i].dns_h.srv->name_len:0, dead_cell->uac[i].dns_h.srv? dead_cell->uac[i].dns_h.srv->name:"", dead_cell->uac[i].dns_h.srv? dead_cell->uac[i].dns_h.srv->refcnt.val:0, dead_cell->uac[i].dns_h.a->name_len, dead_cell->uac[i].dns_h.a->name, dead_cell->uac[i].dns_h.a->refcnt.val); } dns_srv_handle_put_shm_unsafe(&dead_cell->uac[i].dns_h); #endif } /* collected to tags */ tt=dead_cell->fwded_totags; while(tt) { foo=tt->next; shm_free_unsafe(tt->tag.s); shm_free_unsafe(tt); tt=foo; } /* free the avp list */ if (dead_cell->user_avps_from) destroy_avp_list_unsafe( &dead_cell->user_avps_from ); if (dead_cell->user_avps_to) destroy_avp_list_unsafe( &dead_cell->user_avps_to ); if (dead_cell->uri_avps_from) destroy_avp_list_unsafe( &dead_cell->uri_avps_from ); if (dead_cell->uri_avps_to) destroy_avp_list_unsafe( &dead_cell->uri_avps_to ); /* the cell's body */ shm_free_unsafe( dead_cell ); shm_unlock(); }