Esempio n. 1
0
/**
 * 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);
}
Esempio n. 2
0
/**
 * 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;
}