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

📄 smctimer.c

📁 使用标准C开发的同时支持CMPP3.0 和 CMPP2.0 的SP短信网关程序
💻 C
字号:
#include "vscp_os.h"
#include "smctimer.h"

#define TIMER_QUEUE_NUM	(2)
#define TIMER_EXPIRE_FUN_NUM	(128)
#define MAX_EXPIRE_TIMER_NUM	(100)

static TIMER_QUEUE_T TimerQueue[TIMER_QUEUE_NUM];

extern void SysTExpire(void *para,void *para1);
extern void SysTestResExpire(void *para,void *para1);
extern void IsmgMsgExpire(void *para,void *para1);

TimerExpireFun SysTimerExpireFun[] = 
{
	NULL,
	SysTExpire,
	SysTestResExpire,
	IsmgMsgExpire,
};

#define CheckTimerQueueType(q) ((unsigned int)q < TIMER_QUEUE_NUM)

int TimerQueueInit(TIMER_QUEUE_E q)
{
	if (!CheckTimerQueueType(q))
		return (-1);

	memset(&TimerQueue[q],0,sizeof(TIMER_QUEUE_T));

	TimerQueue[q].head.pre = &TimerQueue[q].head;
	TimerQueue[q].head.suc = &TimerQueue[q].head;
	TimerQueue[q].head.TimerTime = 0x7FFFFFFF;
	TimerQueue[q].count = 0x00;
	if (TIMER_QUEUE_SYS == q)
	{
		TimerQueue[q].expirefun = SysTimerExpireFun;
		TimerQueue[q].funcount	= sizeof(SysTimerExpireFun) / sizeof(TimerExpireFun);
		TimerQueue[q].scancount	= 1;
	}
	CriticalSectionInit(&TimerQueue[q].cs);

	return (0);
}

int TimerQueueFindMember(TIMER_QUEUE_E q, TIMER_T *timer)
{
	unsigned int i;
	TIMER_T *tmp = NULL;

	if (NULL  == timer || !CheckTimerQueueType(q)) {
		return (0);
	}

	CriticalSectionEnter(&TimerQueue[q].cs);

	for (i = 0, tmp = TimerQueue[q].head.suc;
		i < TimerQueue[q].count && tmp != &TimerQueue[q].head;
		i++, tmp = tmp->suc) {
		if (tmp == timer) {
			CriticalSectionLeave(&TimerQueue[q].cs);
			return (1);
	}
	}

	CriticalSectionLeave(&TimerQueue[q].cs);
	return (0);
}

int TimerQueueSetMember(TIMER_QUEUE_E q, TIMER_T *timer)
{
	TIMER_T *temptimer = NULL;

	if (timer == NULL) return (-1);

	if (!CheckTimerQueueType(q))
		return (-1);

	TimerQueueReleaseMember(q, timer);

	CriticalSectionEnter(&TimerQueue[q].cs);

	timer->TimerTime = timer->Value + GetSysTimeByMilliSecond();
	
	for (temptimer = TimerQueue[q].head.suc;
		temptimer != &TimerQueue[q].head;
		temptimer = temptimer->suc) 
	{
		if (TimerAfter(temptimer->TimerTime, timer->TimerTime))
			break;
	}

	temptimer->pre->suc = timer;
	timer->pre = temptimer->pre;
	temptimer->pre = timer;
	timer->suc = temptimer;

	TimerQueue[q].count ++;

	CriticalSectionLeave(&TimerQueue[q].cs);

	return (0);
}

int TimerQueueReleaseMember(TIMER_QUEUE_E q, TIMER_T *timer)
{
	if (timer == NULL) return (-1);
	
	if (!CheckTimerQueueType(q))
		return (-1);
	
	CriticalSectionEnter(&TimerQueue[q].cs);
		
	if (0 == TimerQueueFindMember(q, timer)) {
		CriticalSectionLeave(&TimerQueue[q].cs);
		return (-1);
	}

	timer->pre->suc = timer->suc;
	timer->suc->pre = timer->pre;
	TimerQueue[q].count --;

	timer->pre = NULL;
	timer->suc = NULL;
	timer->TimerTime = 0;

	CriticalSectionLeave(&TimerQueue[q].cs);

	return (0);
}
/********************************************************************
	created:		2008/06/19
	created:		19:6:2008   14:33
	author:			lhz
	funName:		TimerQueueCheck
	parameters:		TIMER_QUEUE_E q		定时器对了
	return:			
	purpose:		扫描定时器队列,将超时的定时器出队
*********************************************************************/
void TimerQueueCheck(TIMER_QUEUE_E q)
{
	TIMER_T *temptimer;
	int count;

	if (!CheckTimerQueueType(q))
		return;

	CriticalSectionEnter(&TimerQueue[q].cs);

	count = 0;
	for (	count = 0; 
			(count < TimerQueue[q].scancount) &&
				(TimerQueue[q].count > 0) &&
				(IsTimerExpire(TimerQueue[q].head.suc->TimerTime));
			count ++
		)
	{
		temptimer = TimerQueue[q].head.suc;

		temptimer->suc->pre = temptimer->pre;
		TimerQueue[q].head.suc = temptimer->suc;
		TimerQueue[q].count --;

		temptimer->pre = temptimer->suc = NULL;
		temptimer->TimerTime = 0;

		if ((temptimer->TimeType >= TimerQueue[q].funcount) 
			|| (TimerQueue[q].expirefun[temptimer->TimeType] == NULL))
		{
			continue;
		}

		TimerQueue[q].expirefun[temptimer->TimeType](temptimer->para,temptimer) ;
		}

	CriticalSectionLeave(&TimerQueue[q].cs);

	return;
}

/********************************************************************
	created:		2008/06/19
	created:		19:6:2008   14:22
	author:			spirit
	funName:		CheckTimerQueueStatus
	parameters:		TIMER_QUEUE_E q		定时器队列
	return:			char	定时器状态0正常工作,-1不正常工作	
	purpose:		查看定时器队列中的定时器的状态是否正常
*********************************************************************/
char CheckTimerQueueStatus(TIMER_QUEUE_E q)
{
	TIMER_T *temptimer = NULL;
	int	rel = 0;	
	int count = 0;

	if (!CheckTimerQueueType(q))
		return (-1);

	CriticalSectionEnter(&TimerQueue[q].cs);

	for (	count = 0; 
			(count < TimerQueue[q].scancount) &&
				(TimerQueue[q].count > 0) &&
				(IsTimerExpire(TimerQueue[q].head.suc->TimerTime));
			count ++
		)
	{
		if (count >= MAX_EXPIRE_TIMER_NUM || count >= TimerQueue[q].count)
		{
			rel = -1;
			break;
		}
	}
			
	CriticalSectionLeave(&TimerQueue[q].cs);
	
	return rel;
}

int TimerQueueLen(TIMER_QUEUE_E q)
{
	int rel = 0;

	if (!CheckTimerQueueType(q))
	{
		return MAX_SMC_MSGLEN;
	}

	CriticalSectionEnter(&TimerQueue[q].cs);
	rel = TimerQueue[q].count;
	CriticalSectionLeave(&TimerQueue[q].cs);

	return rel;
}

int TimerQueueIsNull(TIMER_QUEUE_E q)
{
	int rel = 0;
	
	if (!CheckTimerQueueType(q))
	{
		return -1;
	}
	
	CriticalSectionEnter(&TimerQueue[q].cs);
	if(0 == TimerQueue[q].count)
	{
		rel = 0;
	}
	CriticalSectionLeave(&TimerQueue[q].cs);
	
	return rel;
}

⌨️ 快捷键说明

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