⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ms_msg_list.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
字号:
/** * $Id: ms_msg_list.c,v 1.8 2004/08/24 08:58:31 janakj Exp $ * * MSILO module * * Copyright (C) 2001-2003 FhG Fokus * * This file is part of ser, a free SIP server. * * ser is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version * * For a license to use the ser software under conditions * other than those described here, or to purchase support for this * software, please contact iptel.org by e-mail at the following addresses: *    info@iptel.org * * ser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License  * along with this program; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* * History: * -------- *  2003-03-11  major locking changes: not it uses locking.h (andrei) */#include <string.h>#include <unistd.h>#include <stdio.h>#include "../../mem/mem.h"#include "../../mem/shm_mem.h"#include "../../dprint.h"#include "ms_msg_list.h"/** * create a new element */msg_list_el msg_list_el_new(){	msg_list_el mle = NULL;	mle = (msg_list_el)shm_malloc(sizeof(t_msg_list_el));	if(mle == NULL)		return NULL;	mle->next = NULL;	mle->prev = NULL;	mle->msgid = 0;	mle->flag = MS_MSG_NULL;	return mle;}/** * free an element */void msg_list_el_free(msg_list_el mle){	if(mle)		shm_free(mle);}/** * free a list of elements */void msg_list_el_free_all(msg_list_el mle){	msg_list_el p0, p1;			if(!mle)		return;		p0 = mle;	while(p0)	{		p1 = p0;		p0 = p0->next;		msg_list_el_free(p1);	}}/** * init a list */msg_list msg_list_init(){	msg_list ml = NULL;		ml = (msg_list)shm_malloc(sizeof(t_msg_list));	if(ml == NULL)		return NULL;	/* init locks */	if (lock_init(&ml->sem_sent)==0){		LOG(L_CRIT, "msilo: could not initialize a lock\n");		goto clean;	};	if (lock_init(&ml->sem_done)==0){		LOG(L_CRIT, "msilo: could not initialize a lock\n");		lock_destroy(&ml->sem_sent);		goto clean;	};	ml->nrsent = 0;	ml->nrdone = 0;	ml->lsent = NULL;	ml->ldone = NULL;		return ml;clean:	shm_free(ml);	return NULL;}/** * free a list */void msg_list_free(msg_list ml){	msg_list_el p0, p1;	if(!ml)		return;	lock_destroy(&ml->sem_sent);	lock_destroy(&ml->sem_done);	if(ml->nrsent>0 && ml->lsent)	{ // free sent list		p0 = ml->lsent;		ml->lsent = NULL;		ml->nrsent = 0;		while(p0)		{			p1 = p0->next;			msg_list_el_free(p0);			p0 = p1;		}			}	if(ml->nrdone>0 && ml->ldone)	{ // free done list		p0 = ml->ldone;		ml->ldone = NULL;		ml->nrdone = 0;		while(p0)		{			p1 = p0->next;			msg_list_el_free(p0);			p0 = p1;		}	}		shm_free(ml);	}/** * check if a message is in list */int msg_list_check_msg(msg_list ml, int mid){	msg_list_el p0, p1;			if(!ml || mid==0)		goto errorx;	DBG("MSILO:msg_list_check_msg: checking msgid=%d\n", mid);		lock_get(&ml->sem_sent);	p0 = p1 = ml->lsent;	while(p0)	{		if(p0->msgid==mid)			goto exist;		p1 = p0;		p0 = p0->next;	}	p0 = msg_list_el_new();	if(!p0)	{		DBG("MSILO:msg_list_check_msg: Error creating new msg elem.\n");		goto error;	}	p0->msgid = mid;	p0->flag |= MS_MSG_SENT;	if(p1)	{		p1->next = p0;		p0->prev = p1;		goto done;	}		ml->lsent = p0;		done:	ml->nrsent++;	lock_release(&ml->sem_sent);	DBG("MSILO:msg_list_check_msg: msg added to sent list.\n");	return MSG_LIST_OK;exist:	lock_release(&ml->sem_sent);	DBG("MSILO:msg_list_check_msg: msg already in sent list.\n");	return MSG_LIST_EXIST;	error:	lock_release(&ml->sem_sent);errorx:	return MSG_LIST_ERR;}/** * set flag for message with mid */int msg_list_set_flag(msg_list ml, int mid, int fl){	msg_list_el p0;			if(!ml || mid==0)		goto errorx;		lock_get(&ml->sem_sent);	p0 = ml->lsent;	while(p0)	{		if(p0->msgid==mid)		{			p0->flag |= fl;			DBG("MSILO: msg_list_set_flag: mid:%d fl:%d\n", p0->msgid, fl);			goto done;		}		p0 = p0->next;	}done:	lock_release(&ml->sem_sent);	return MSG_LIST_OK;errorx:	return MSG_LIST_ERR;}/** * check if the messages from list were sent */int msg_list_check(msg_list ml){	msg_list_el p0;			if(!ml)		goto errorx;		lock_get(&ml->sem_sent);	if(ml->nrsent<=0)		goto done;		lock_get(&ml->sem_done);		p0 = ml->lsent;	while(p0)	{		if(p0->flag & MS_MSG_DONE || p0->flag & MS_MSG_ERRO)		{			DBG("MSILO: msg_list_check: mid:%d got reply\n", p0->msgid);			if(p0->prev)				(p0->prev)->next = p0->next;			else			    ml->lsent = p0->next;			if(p0->next)				(p0->next)->prev = p0->prev;			ml->nrsent--;			if(!ml->nrsent)				ml->lsent = NULL;			if(ml->ldone)				(ml->ldone)->prev = p0;			p0->next = ml->ldone;						p0->prev = NULL;			ml->ldone = p0;			ml->nrdone++;		}		p0 = p0->next;	}	lock_release(&ml->sem_done);done:	lock_release(&ml->sem_sent);	return MSG_LIST_OK;errorx:	return MSG_LIST_ERR;}/** * reset a list * return old list */msg_list_el msg_list_reset(msg_list ml){	msg_list_el p0;			if(!ml)		return NULL;		lock_get(&ml->sem_done);	p0 = ml->ldone;	ml->ldone = NULL;	ml->nrdone = 0;	lock_release(&ml->sem_done);		return p0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -