/** * delete an entity from working list of a worker * - jwl : pointer to the workers list * - sid : id of the entity (connection to Jabber - usually SHOULD be FROM * header of the incoming SIP message * - _pid : process id of the worker */ void xj_wlist_del(xj_wlist jwl, xj_jkey jkey, int _pid) { int i; void *p; if(jwl==NULL || jkey==NULL || jkey->id==NULL || jkey->id->s==NULL) return; for(i=0; i < jwl->len; i++) if(jwl->workers[i].pid == _pid) break; if(i >= jwl->len) { LM_DBG("%d: key <%.*s> not found in [%d]...\n", _pid, jkey->id->len, jkey->id->s, i); return; } #ifdef XJ_EXTRA_DEBUG LM_DBG("%d: trying to delete entry for <%.*s>...\n", _pid, jkey->id->len, jkey->id->s); #endif lock_set_get(jwl->sems, i); p = del234(jwl->workers[i].sip_ids, (void*)jkey); if(p != NULL) { jwl->workers[i].nr--; #ifdef XJ_EXTRA_DEBUG LM_DBG("%d: sip id <%.*s> deleted\n", _pid, jkey->id->len, jkey->id->s); #endif xj_jkey_free_p(p); } lock_set_release(jwl->sems, i); }
/** * send disconnected info to all SIP users associated with worker idx * and clean the entries from wlist */ int xj_wlist_clean_jobs(xj_wlist jwl, int idx, int fl) { xj_jkey p; if(jwl==NULL || idx < 0 || idx >= jwl->len || !jwl->workers[idx].sip_ids) return -1; lock_set_get(jwl->sems, idx); while((p=(xj_jkey)delpos234(jwl->workers[idx].sip_ids, 0))!=NULL) { if(fl) { #ifdef XJ_EXTRA_DEBUG DBG("XJAB:xj_wlist_send_info: sending disconnect message" " to <%.*s>\n", p->id->len, p->id->s); #endif xj_send_sip_msgz(_PADDR(jwl), p->id, &jab_gw_name, XJ_DMSG_INF_DISCONNECTED, NULL); } jwl->workers[idx].nr--; xj_jkey_free_p(p); } lock_set_release(jwl->sems, idx); return 0; }