void xavp_free_unsafe(sr_xavp_t *xa) { if(xa->val.type == SR_XTYPE_DATA) { if(xa->val.v.data!=NULL && xa->val.v.data->pfree!=NULL) { xa->val.v.data->pfree(xa->val.v.data->p, xavp_shm_free_unsafe); shm_free_unsafe(xa->val.v.data); } } else if(xa->val.type == SR_XTYPE_XAVP) { xavp_destroy_list_unsafe(&xa->val.v.xavp); } shm_free_unsafe(xa); }
inline static void* sh_realloc(void* p, unsigned int size) { void *r; shm_lock(); shm_free_unsafe(p); r=shm_malloc_unsafe(size); shm_unlock(); return r; }
void destroy_avp_list_unsafe( struct usr_avp **list ) { struct usr_avp *avp, *foo; avp = *list; while( avp ) { foo = avp; avp = avp->next; shm_free_unsafe( foo ); } *list = 0; }
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(); }
inline static void* sh_realloc(void* p, unsigned int size) { void *r; #ifndef HP_MALLOC shm_lock(); shm_free_unsafe(p); r = shm_malloc_unsafe(size); #else shm_free(p); r = shm_malloc(size); #endif shm_threshold_check(); #ifndef HP_MALLOC shm_unlock(); #endif return r; }
void free_local_ack_unsafe(struct retr_buf *lack) { shm_free_unsafe(lack); }
void xavp_shm_free_unsafe(void *p) { shm_free_unsafe(p); }
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(); }