📄 smsref.c
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <fcntl.h>
#include <errno.h>
#ifndef _LINUX_
#define _LINUX_
#endif
#ifdef _LINUX_
#include<sys/types.h>
#include<netdb.h>
#include<syslog.h>
#include<fcntl.h>
#include <signal.h>
#include <utmp.h>
#include <unistd.h>
#include <pthread.h>
#endif
#include "sms.h"
#define SMS_REF_CNT 30
int giSmsRefBufWrite = 0;
int giSmsRefBufCnt = SMS_REF_CNT;
SMS_REF gSmsRefBuf[SMS_REF_CNT];
//SMS_REF gSmsRef;
SMS_REF gCurSmsRef;
SMS_REF *smsref_head = NULL;
SMS_REF *smsref_tail = NULL;
#ifdef _LINUX_
pthread_mutex_t bufmutex = PTHREAD_MUTEX_INITIALIZER;
#endif
void smspkt_P(void)
{
#ifdef _LINUX_
pthread_mutex_lock(&bufmutex);
#endif
}
void smspkt_V(void)
{
#ifdef _LINUX_
pthread_mutex_unlock(&bufmutex);
#endif
}
/**********************************************
* extern variales
**********************************************/
extern char debugType;
extern void WMMP_TRACE(char type, const char *format, ...);
/************SMS packet buffer****************/
int initsmsrefbuf(void);
int clearsmsrefbuf(void);
SMS_REF* allocsmsrefbuf(void);
int freesmsrefbuf(SMS_REF *ptSmsRef);
int add_queue(SMS_REF *ptSmsRef);
SMS_REF *del_queue(void);
/************SMS packet buffer***************/
//initialize
int initsmsrefbuf(void)
{
int i;
smspkt_P();
giSmsRefBufWrite = 0;
giSmsRefBufCnt = SMS_REF_CNT;
for (i=0; i < SMS_REF_CNT ; i++)
{
memset(gSmsRefBuf + i, 0, sizeof(gSmsRefBuf[i]));
}
smsref_head = NULL;
smsref_tail= NULL;
smspkt_V();
return 0;
}
SMS_REF *allocsmsrefbuf(void)
{
SMS_REF *smsref;
int i;
smspkt_P();
WMMP_TRACE(debugType, "\r\nallocsmsrefbuf:gCnt=%d.", giSmsRefBufCnt);
if (giSmsRefBufCnt>0)
{
giSmsRefBufCnt--;
for (i=0; i < SMS_REF_CNT; i++)
{
smsref = &gSmsRefBuf[giSmsRefBufWrite];
giSmsRefBufWrite++;
giSmsRefBufWrite %= SMS_REF_CNT;
if (0 == smsref->allocated)
break;
}
if (SMS_REF_CNT == i)
{
WMMP_TRACE(debugType, "\r\nError! NOT FOUND AN EMPTY SMS ref buffer!");
giSmsRefBufCnt++;
smspkt_V();
return NULL;
}
memset(smsref, 0, sizeof(SMS_REF));
smsref->allocated=1;
WMMP_TRACE(debugType, "\r\nallocsmsbuf:ret %x.", smsref);
smspkt_V();
return smsref;
}
WMMP_TRACE(debugType, "\r\nallocsmsrefbuf:ret null1.");
smspkt_V();
return NULL;
}
int freesmsrefbuf(SMS_REF *ptSmsRef)
{
int i = 0;
smspkt_P();
WMMP_TRACE(debugType, "\r\nfreesmsrefbuf:[%x], gCnt=%d.", ptSmsRef, giSmsRefBufCnt);
if(ptSmsRef == NULL)
{
WMMP_TRACE(debugType, "\r\nfree a NULL sms ref buffer!!!");
smspkt_V();
return -1;
}
if(giSmsRefBufCnt >= SMS_REF_CNT)
{
WMMP_TRACE(debugType, "\r\nall empty sms ref buffer");
smspkt_V();
return -2;
}
for(i = 0; i < SMS_REF_CNT; i++)
{
if(ptSmsRef == &gSmsRefBuf[i])
break;
}
if(i == SMS_REF_CNT)
{
WMMP_TRACE(debugType, "\r\nFree an not existing sms ref buffer");
smspkt_V();
return -3;
}
ptSmsRef->smsRef = 0;
ptSmsRef->allocated = 0;
ptSmsRef->next = NULL;
giSmsRefBufCnt++;
smspkt_V();
return 0;
}
int add_queue(SMS_REF* ptSmsRef)
{
smspkt_P();
if(ptSmsRef == NULL)
{
WMMP_TRACE(debugType, "\r\nError: Add a NULL SMS ref buffer to queue");
smspkt_V();
return -1;
}
if(smsref_head == NULL)
{
smsref_head = ptSmsRef;
smsref_tail = ptSmsRef;
}
else
{
if(smsref_tail == NULL)
{
smsref_tail = ptSmsRef;
}
else
{
smsref_tail->next = ptSmsRef;
smsref_tail = ptSmsRef;
}
}
smspkt_V();
return 0;
}
SMS_REF* del_queue(void)
{
SMS_REF *pRet = NULL;
smspkt_P();
if(smsref_head == NULL)
{
WMMP_TRACE(debugType, "\r\nError: SMS buffer is empty!");
smspkt_V();
return NULL;
}
pRet = smsref_head;
smsref_head = smsref_head->next;
if(smsref_head == NULL)
{
smsref_tail = NULL;
}
if(pRet != NULL)
{
memcpy(&gCurSmsRef, pRet, sizeof(SMS_REF));
}
smspkt_V();
return pRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -