/*! * \brief Free all memory used by the given structure * * Free all memory used by the given structure. * The structure must be removed from all linked * lists first * \param _r freed record list */ void free_impurecord(impurecord_t* _r) { ucontact_t* ptr; struct ul_callback *cbp, *cbp_tmp; struct _reg_subscriber* subscriber, *s_tmp; while (_r->contacts) { ptr = _r->contacts; _r->contacts = _r->contacts->next; free_ucontact(ptr); } //free IMS specific extensions if (_r->ccf1.s) shm_free(_r->ccf1.s); if (_r->ccf2.s) shm_free(_r->ccf2.s); if (_r->ecf1.s) shm_free(_r->ecf1.s); if (_r->ecf2.s) shm_free(_r->ecf2.s); if (_r->s) { LM_DBG("ref count on this IMS data is %d\n", _r->s->ref_count); lock_get(_r->s->lock); if (_r->s->ref_count == 1) { LM_DBG("freeing IMS subscription data\n"); free_ims_subscription_data(_r->s); } else { LM_DBG("decrementing IMS subscription data ref count\n"); _r->s->ref_count--; lock_release(_r->s->lock); } } /*remove REG subscriptions to this IMPU*/ subscriber = _r->shead; while (subscriber) { s_tmp = subscriber->next; free_subscriber(subscriber); subscriber = s_tmp; } if (_r->public_identity.s) shm_free(_r->public_identity.s); //free callback list for (cbp = _r->cbs->first; cbp;) { cbp_tmp = cbp; cbp = cbp->next; if (cbp_tmp->param) shm_free(cbp_tmp->param); shm_free(cbp_tmp); } shm_free(_r->cbs); shm_free(_r); }
void delete_subscriber(impurecord_t* urec, reg_subscriber *s) { LM_DBG("Deleting subscriber"); if (urec->shead == s) urec->shead = s->next; else s->prev->next = s->next; if (urec->stail == s) urec->stail = s->prev; else s->next->prev = s->prev; LM_DBG("About to free subscriber memory"); free_subscriber(s); }
/*! * \brief Free all memory used by the given structure * * Free all memory used by the given structure. * The structure must be removed from all linked * lists first * \param _r freed record list */ void free_impurecord(impurecord_t* _r) { struct ul_callback *cbp, *cbp_tmp; struct _reg_subscriber* subscriber, *s_tmp; LM_DBG("free_impurecord\n"); //free IMS specific extensions if (_r->ccf1.s) shm_free(_r->ccf1.s); if (_r->ccf2.s) shm_free(_r->ccf2.s); if (_r->ecf1.s) shm_free(_r->ecf1.s); if (_r->ecf2.s) shm_free(_r->ecf2.s); if (_r->s) { unref_subscription(_r->s); } /*remove REG subscriptions to this IMPU*/ subscriber = _r->shead; while (subscriber) { s_tmp = subscriber->next; free_subscriber(subscriber); subscriber = s_tmp; } _r->shead = 0; if (_r->public_identity.s) shm_free(_r->public_identity.s); if (_r->private_identity.s) shm_free(_r->private_identity.s); //free callback list for (cbp = _r->cbs->first; cbp;) { cbp_tmp = cbp; cbp = cbp->next; if (cbp_tmp->param) shm_free(cbp_tmp->param); shm_free(cbp_tmp); } shm_free(_r->cbs); shm_free(_r); }
void delete_subscriber(impurecord_t* urec, reg_subscriber *s) { LM_DBG("Deleting subscriber [%.*s] from IMPU: [%.*s]", s->watcher_uri.len, s->watcher_uri.s, urec->public_identity.len, urec->public_identity.s); if (db_mode == WRITE_THROUGH && db_unlink_subscriber_from_impu(urec, s) !=0) { LM_ERR("Failed to delete DB linking subscriber [%.*s] to IMPU [%.*s]...continuing but db will be out of sync!\n", s->presentity_uri.len, s->presentity_uri.s, urec->public_identity.len, urec->public_identity.s); } if (db_mode == WRITE_THROUGH && db_delete_subscriber(urec, s) != 0) { LM_ERR("error removing subscriber from DB [%.*s]... will still remove from memory\n", s->presentity_uri.len, s->presentity_uri.s); } if (urec->shead == s) urec->shead = s->next; else s->prev->next = s->next; if (urec->stail == s) urec->stail = s->prev; else s->next->prev = s->prev; LM_DBG("About to free subscriber memory"); free_subscriber(s); }
void external_delete_subscriber(reg_subscriber *s, udomain_t* _t, int lock_domain) { LM_DBG("Deleting subscriber"); impurecord_t* urec; LM_DBG("Updating reg subscription in IMPU record"); if(lock_domain) lock_udomain(_t, &s->presentity_uri); int res = get_impurecord(_t, &s->presentity_uri, &urec); if (res != 0) { if(lock_domain) unlock_udomain(_t, &s->presentity_uri); return; } if (urec->shead == s) urec->shead = s->next; else s->prev->next = s->next; if (urec->stail == s) urec->stail = s->prev; else s->next->prev = s->prev; LM_DBG("About to free subscriber memory"); free_subscriber(s); if(lock_domain) unlock_udomain(_t, &s->presentity_uri); }
reg_subscriber* new_subscriber(subscriber_data_t* subscriber_data) { subs_t subs; reg_subscriber *s; int len; char *p; unsigned int hash_code = 0; memset(&subs, 0, sizeof(subs_t)); len = sizeof (reg_subscriber) + subscriber_data->callid->len + subscriber_data->ftag->len + subscriber_data->ttag->len + subscriber_data->watcher_contact->len + subscriber_data->watcher_uri->len + subscriber_data->presentity_uri->len + subscriber_data->record_route->len + subscriber_data->sockinfo_str->len; LM_DBG("Creating new subscription to reg"); s = (reg_subscriber*) shm_malloc(len); if (s == 0) { LM_ERR("no more shm mem (%d)\n", len); return 0; } memset(s, 0, len); s->local_cseq = subscriber_data->local_cseq; s->event = subscriber_data->event; s->expires = subscriber_data->expires; s->version = subscriber_data->version; p = (char*) (s + 1); s->call_id.s = p; s->call_id.len = subscriber_data->callid->len; memcpy(p, subscriber_data->callid->s, subscriber_data->callid->len); p += subscriber_data->callid->len; s->to_tag.s = p; s->to_tag.len = subscriber_data->ttag->len; memcpy(p, subscriber_data->ttag->s, subscriber_data->ttag->len); p += subscriber_data->ttag->len; s->from_tag.s = p; s->from_tag.len = subscriber_data->ftag->len; memcpy(p, subscriber_data->ftag->s, subscriber_data->ftag->len); p += subscriber_data->ftag->len; s->watcher_uri.s = p; s->watcher_uri.len = subscriber_data->watcher_uri->len; memcpy(p, subscriber_data->watcher_uri->s, subscriber_data->watcher_uri->len); p += subscriber_data->watcher_uri->len; s->watcher_contact.s = p; s->watcher_contact.len = subscriber_data->watcher_contact->len; memcpy(p, subscriber_data->watcher_contact->s, subscriber_data->watcher_contact->len); p += subscriber_data->watcher_contact->len; s->record_route.s = p; s->record_route.len = subscriber_data->record_route->len; memcpy(p, subscriber_data->record_route->s, subscriber_data->record_route->len); p += subscriber_data->record_route->len; s->sockinfo_str.s = p; s->sockinfo_str.len = subscriber_data->sockinfo_str->len; memcpy(p, subscriber_data->sockinfo_str->s, subscriber_data->sockinfo_str->len); p += subscriber_data->sockinfo_str->len; s->presentity_uri.s = p; s->presentity_uri.len = subscriber_data->presentity_uri->len; memcpy(p, subscriber_data->presentity_uri->s, subscriber_data->presentity_uri->len); p += subscriber_data->presentity_uri->len; if (p != (((char*) s) + len)) { LM_CRIT("buffer overflow\n"); free_subscriber(s); return 0; } /*This lets us get presentity URI info for subsequent SUBSCRIBEs that don't have presentity URI as req URI*/ get_act_time(); subs.pres_uri = s->presentity_uri; subs.from_tag = s->from_tag; subs.to_tag = s->to_tag; subs.callid = s->call_id; subs.expires = s->expires - act_time; subs.contact = s->watcher_contact; hash_code = core_hash(&subs.callid, &subs.to_tag, sub_dialog_hash_size); LM_DBG("Adding sub dialog hash info with call_id: <%.*s> and ttag <%.*s> amd ftag <%.*s> and hash code <%d>", subs.callid.len, subs.callid.s, subs.to_tag.len, subs.to_tag.s, subs.from_tag.len, subs.from_tag.s, hash_code); if (pres_insert_shtable(sub_dialog_table, hash_code, &subs)) { LM_ERR("while adding new subscription\n"); return 0; } return s; }