AMPS:定时器模块源码解读

来源:互联网 发布:海王星证券软件下载 编辑:程序博客网 时间:2024/05/17 04:55

  Timer模块的实现比较复杂,需要结合前面的文章《AMPS:定时器管理》才能有所理解,下面看看AMPS中的定时器实现,有些细节方面我也没有想清楚。

 AMPS_Timer.h

#ifndef __HEADER_AMPS_TIMER_H__#define __HEADER_AMPS_TIMER_H__#ifdef __cplusplus    extern "C" {#endif#include "AMPS_Defines.h"#include "AMPS_Core.h"#include "AMPS_SystemAPI.h"#include "AMPS_TimerTicker.h"typedef struct _AMPSTimer           t_AMPSTimer;typedef struct _AMPSTimerNodeData   t_AMPSTimerNodeData;typedef struct _AMPSTimerSlot       t_AMPSTimerSlot;typedef struct _AMPSTimerMessage    t_AMPSTimerMessage;#define AMPS_TIMER_CURRENT_SLOT_MILLISECONDS1#define AMPS_TIMER_CURRENT_SLOT_SECONDS2#define AMPS_TIMER_CURRENT_SLOT_MINUTES3#define AMPS_TIMER_CURRENT_SLOT_HOURS4#define AMPS_TIMER_CURRENT_SLOT_DAYS5#define AMPS_TIMER_STATUS_ENABLE1#define AMPS_TIMER_STATUS_DISABLE2#define AMPS_TIMER_SERVER_MSG_PORT5000//#define AMPS_TIMER_NUM_OF_MILLI_SECOND_SLOTS      50//#define AMPS_TIMER_MIN_MILLI_SECOND_SLOT_TIME     20    //20 Milli Second#define AMPS_TIMER_NUM_OF_SECOND_SLOTS             60#define AMPS_TIMER_MIN_SECOND_SLOT_TIME            1000 //1 Second#define AMPS_TIMER_NUM_OF_MINUTE_SLOTS             60#define AMPS_TIMER_MIN_MINUTE_SLOT_TIME            (AMPS_TIMER_MIN_SECOND_SLOT_TIME * AMPS_TIMER_NUM_OF_SECOND_SLOTS) //1 Minute#define AMPS_TIMER_NUM_OF_HOUR_SLOTS             24#define AMPS_TIMER_MIN_HOUR_SLOT_TIME            (AMPS_TIMER_MIN_MINUTE_SLOT_TIME * AMPS_TIMER_NUM_OF_MINUTE_SLOTS) //1 Hour#define AMPS_TIMER_NUM_OF_DAY_SLOTS             7#define AMPS_TIMER_MIN_DAY_SLOT_TIME            (AMPS_TIMER_MIN_HOUR_SLOT_TIME * AMPS_TIMER_NUM_OF_HOUR_SLOTS) //1 Day//#define AMPS_TIMER_MIN_SLOT_TIME             AMPS_TIMER_MIN_MILLI_SECOND_SLOT_TIME  //Milli Seconds//#define AMPS_TIMER_SLOT_TIMEOUT_SEC            0//#define AMPS_TIMER_SLOT_TIMEOUT_MSEC           AMPS_TIMER_MIN_MILLI_SECOND_SLOT_TIME//#define AMPS_TIMER_MIN_TIMER_VALUE          AMPS_TIMER_MIN_MILLI_SECOND_SLOT_TIME   //Milli Seconds//#define AMPS_TIMER_MAX_TIMER_VALUE          (1000 * 60 * 60 * 24 * 7)   //Milli Seconds it is 1 month nowstruct _AMPSTimerSlot{t_AMPSDList*poDList;};/*定时器模块结构*/struct _AMPSTimer{//intnTimerConnectionListenPort;//intnSlotTimeOutInMilliSeconds;//intnSlotTimeOutInSeconds;intnMinSlotTime;   /*最小的结点个数*/intnMinTimerValue; /*最小时间间隔*/intnMaxTimerValue; /*最大时间间隔*/    /*毫秒链表*/    //t_AMPSTimerSlot   poTimerSlotMilliSeconds[AMPS_TIMER_NUM_OF_MILLI_SECOND_SLOTS];intnNoOfMilliSecondsSlots;  /*毫秒链表中的结点总个数*/intnMinMilliSecondsSlotTime;/*毫秒链表中的最小时间间隔*/t_AMPSTimerSlot*   poTimerSlotMilliSeconds; /*毫秒链表*/    unsigned int    unIndexForMilliSecondsSlot;/*当前链表中结点个数*/    /*秒数组*/    t_AMPSTimerSlot   poTimerSlotSeconds[AMPS_TIMER_NUM_OF_SECOND_SLOTS];    unsigned int    unIndexForSecondsSlot;    /*分数组*/     t_AMPSTimerSlot   poTimerSlotMinutes[AMPS_TIMER_NUM_OF_MINUTE_SLOTS];    unsigned int    unIndexForMinutesSlot;    /*小时数组*/    t_AMPSTimerSlot   poTimerSlotHours[AMPS_TIMER_NUM_OF_HOUR_SLOTS];    unsigned int    unIndexForHoursSlot;    /*天数组*/    t_AMPSTimerSlot   poTimerSlotDays[AMPS_TIMER_NUM_OF_DAY_SLOTS];    unsigned int    unIndexForDaysSlot;    /*定时器线程句柄*/t_AMPSThreads     oTimerThread;    /*ticker时间*/t_AMPSTimerTicker*poAMPSTimerTicker;};/*定时器结点结构*/struct _AMPSTimerNodeData{    AMPS_TimeOutNotifyCallBack  pfAMPS_TimerCallBack;    void*           pvData;    char            chStatus;    void*           pvAMPSContext;void*pvSListNodePtr;unsigned intunCurrentTimerSlot;unsigned int unDaysSlotNo;unsigned int unHoursSlotNo;unsigned int unMinutesSlotNo;unsigned int unSecondsSlotNo;unsigned int unMilliSecondsSlotNo;};struct _AMPSTimerMessage{    unsigned intunTickCount;};int Timer_Init(t_AMPSContext* r_poAMPSContext, e_AMPSTimerResolution r_oAMPSTimerResolution, int r_nTimerConnectionListenPort);void Timer_Cleanup(t_AMPSContext* r_poAMPSContext);int Timer_TickerThread(void* r_pvAMPSContext);int Timer_CreateTimerConnection(t_AMPSContext* r_poAMPSContext, void* r_pvAMPSTimer, int r_nTimerConnectionListenPort);int Timer_ProcessTimerEvent(void* r_pvAMPSContext);int Timer_RecvDataCallback(AMPS_HANDLE r_hAMPS_HANDLE, AMPS_APP_HANDLE r_hAMPS_APP_HANDLE, AMPS_NET_HANDLE r_hAMPS_NET_HANDLE, unsigned char* r_puchBuff, int r_nBuffLength, int r_nPort, char* r_chIPAddress);void Timer_ProcessTimerSlot(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer);void* Timer_StartTimer(void* r_pvAMPSContext, unsigned int r_unTimerValue, AMPS_TimeOutNotifyCallBack r_pfAMPS_TimerCallBack, void* r_pvData);int Timer_DeleteTimer(void* r_pvAMPSContext, void* r_pvLinkNode);int Timer_FreeNodeData(void** r_ppvAMPSTimerNodeData);void Timer_ProcessDaysTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForDaysTimer);void Timer_ProcessHoursTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForHoursTimer);void Timer_ProcessMinutesTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForMinutesTimer);void Timer_ProcessSecondsTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForSecondsTimer);int Timer_ProcessMilliSecondsNodeData(void** r_ppvAMPSTimerNodeData);#ifdef __cplusplus   }#endif#endif /* __HEADER_AMPS_TIMER_H__ */

AMPS_Timer.c

#include "AMPS_TCP.h"#include "AMPS_LinkList.h"#include "AMPS_Timer.h"#include "AMPS_MemMgt.h"#include "AMPS_Trace.h"/*****************************************************************函数名称: Timer_Init功能描述: Timer模块初始化入参:        t_AMPSContext* r_poAMPSContext AMPS应用上下文        e_AMPSTimerResolution r_oAMPSTimerResolution 定时器时长        int r_nTimerConnectionListenPort出参:     --返回值:    int*****************************************************************/int Timer_Init(t_AMPSContext* r_poAMPSContext, e_AMPSTimerResolution r_oAMPSTimerResolution, int r_nTimerConnectionListenPort){    t_AMPSTimer* poAMPSTimer = NULL;    unsigned int unCurrentTime = 0;    int nCounter = 0;    /*分配Timer解句柄*/    r_poAMPSContext->pvTimerContext = AMPS_InternalMalloc(sizeof(t_AMPSTimer));    if (NULL == r_poAMPSContext->pvTimerContext)    {        TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for r_poAMPSContext->pvTimerContext.\n");        return AMPS_ERROR_FAILURE;    }    poAMPSTimer = r_poAMPSContext->pvTimerContext;    /*根据不同的超时时间进行Timer内容初始化*/if(AMPS_TIMER_RESOLUTION_20MS == r_oAMPSTimerResolution){poAMPSTimer->nMinMilliSecondsSlotTime = 20;poAMPSTimer->nNoOfMilliSecondsSlots = 1000/20;}elseif(AMPS_TIMER_RESOLUTION_25MS == r_oAMPSTimerResolution){poAMPSTimer->nMinMilliSecondsSlotTime = 25;poAMPSTimer->nNoOfMilliSecondsSlots = 1000/25;}elseif(AMPS_TIMER_RESOLUTION_50MS == r_oAMPSTimerResolution){poAMPSTimer->nMinMilliSecondsSlotTime = 50;poAMPSTimer->nNoOfMilliSecondsSlots = 1000/50;}elseif(AMPS_TIMER_RESOLUTION_100MS == r_oAMPSTimerResolution){poAMPSTimer->nMinMilliSecondsSlotTime = 100;poAMPSTimer->nNoOfMilliSecondsSlots = 1000/100;}    /*分配Timer中ticker指针内存*/poAMPSTimer->poAMPSTimerTicker = AMPS_InternalMalloc(sizeof(t_AMPSTimerTicker));if (NULL == poAMPSTimer->poAMPSTimerTicker){TRACE(TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for poAMPSTimerTicker.\n");return AMPS_ERROR_FAILURE;}    /*初始化Ticker成员*/poAMPSTimer->poAMPSTimerTicker->nTimerIsRunning = AMPS_TRUE;poAMPSTimer->poAMPSTimerTicker->nTimerTraceID = TIMER_TRACE_ID(r_poAMPSContext);poAMPSTimer->poAMPSTimerTicker->nTimerConnectionListenPort = r_nTimerConnectionListenPort;poAMPSTimer->poAMPSTimerTicker->nSlotTimeOutInMilliSeconds = poAMPSTimer->nMinMilliSecondsSlotTime;poAMPSTimer->poAMPSTimerTicker->nSlotTimeOutInSeconds = 0;//poAMPSTimer->nSlotTimeOutInMilliSeconds = poAMPSTimer->nMinMilliSecondsSlotTime;//poAMPSTimer->nSlotTimeOutInSeconds = 0;poAMPSTimer->nMinSlotTime = poAMPSTimer->nMinMilliSecondsSlotTime;poAMPSTimer->nMinTimerValue = poAMPSTimer->nMinMilliSecondsSlotTime;    /*最大的定时器时长,一周*/poAMPSTimer->nMaxTimerValue = AMPS_TIMER_NUM_OF_DAY_SLOTS * AMPS_TIMER_MIN_DAY_SLOT_TIME;//poAMPSTimer->nTimerConnectionListenPort = r_nTimerConnectionListenPort;poAMPSTimer->poTimerSlotMilliSeconds = AMPS_InternalMalloc(sizeof(t_AMPSTimerSlot) * poAMPSTimer->nNoOfMilliSecondsSlots);if (NULL == poAMPSTimer->poTimerSlotMilliSeconds){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for poAMPSTimer->poTimerSlotMilliSeconds.\n");return AMPS_ERROR_FAILURE;}//poAMPSTimer->poNetworkMessage = NULL;/*获取当前时长,单位:毫秒*/    unCurrentTime = SAPI_GetCurrentTimeInMilliSec(r_poAMPSContext) + poAMPSTimer->nMinSlotTime; // add min slot time for the first slot    /*不同时长的定时器数组初始化*///For Milli-Seconds SlotspoAMPSTimer->unIndexForMilliSecondsSlot = 0;    for(nCounter = 0; nCounter < poAMPSTimer->nNoOfMilliSecondsSlots; nCounter++)    {        if(NULL == DList_Init(&poAMPSTimer->poTimerSlotMilliSeconds[nCounter].poDList))        {            TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n");            return AMPS_ERROR_FAILURE;        }    }//For Seconds SlotspoAMPSTimer->unIndexForSecondsSlot = 0;    for(nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_SECOND_SLOTS; nCounter++)    {        if(NULL == DList_Init(&poAMPSTimer->poTimerSlotSeconds[nCounter].poDList))        {            TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n");            return AMPS_ERROR_FAILURE;        }    }//For Minutes SlotspoAMPSTimer->unIndexForMinutesSlot = 0;    for(nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_MINUTE_SLOTS; nCounter++)    {        if(NULL == DList_Init(&poAMPSTimer->poTimerSlotMinutes[nCounter].poDList))        {            TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n");            return AMPS_ERROR_FAILURE;        }    }//For Hours SlotspoAMPSTimer->unIndexForHoursSlot = 0;    for(nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_HOUR_SLOTS; nCounter++)    {        if(NULL == DList_Init(&poAMPSTimer->poTimerSlotHours[nCounter].poDList))        {            TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n");            return AMPS_ERROR_FAILURE;        }    }//For Days SlotspoAMPSTimer->unIndexForDaysSlot = 0;    for(nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_DAY_SLOTS; nCounter++)    {        if(NULL == DList_Init(&poAMPSTimer->poTimerSlotDays[nCounter].poDList))        {            TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n");            return AMPS_ERROR_FAILURE;        }    }    /*建立定时器服务器,用于接收事件通知,用来接收Ticker通知?*/    if(AMPS_ERROR_FAILURE == Timer_CreateTimerConnection(r_poAMPSContext, poAMPSTimer, r_nTimerConnectionListenPort))    {        TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Timer_CreateTimerConnection failed.\n");        return AMPS_ERROR_FAILURE;    }    return AMPS_SUCCESS;}/*****************************************************************函数名称: Timer_Cleanup功能描述: Timer模块销毁入参:        t_AMPSContext* r_poAMPSContext AMPS应用上下文出参:     --返回值:    void*****************************************************************/void Timer_Cleanup(t_AMPSContext* r_poAMPSContext){    t_AMPSTimer* poAMPSTimer = (t_AMPSTimer*)r_poAMPSContext->pvTimerContext;    t_AMPSThreads     oTimerThread = poAMPSTimer->oTimerThread;    int nCounter = 0;    TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");    /*设置定时器工作模式为FALSE*/    poAMPSTimer->poAMPSTimerTicker->nTimerIsRunning = AMPS_FALSE;    /*线程挂起,等待线程函数处理完成*/    if (AMPS_ERROR_FAILURE == SAPI_WaitForThread(r_poAMPSContext, &oTimerThread))    {        TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SAPI_WaitForThread failed.\n");    }    for (nCounter = 0; nCounter < poAMPSTimer->nNoOfMilliSecondsSlots; nCounter++)    {        DList_Free(&poAMPSTimer->poTimerSlotMilliSeconds[nCounter].poDList, NULL);    }    for (nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_SECOND_SLOTS; nCounter++)    {        DList_Free(&poAMPSTimer->poTimerSlotSeconds[nCounter].poDList, NULL);    }    for (nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_MINUTE_SLOTS; nCounter++)    {        DList_Free(&poAMPSTimer->poTimerSlotMinutes[nCounter].poDList, NULL);    }    for (nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_HOUR_SLOTS; nCounter++)    {        DList_Free(&poAMPSTimer->poTimerSlotHours[nCounter].poDList, NULL);    }    for (nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_DAY_SLOTS; nCounter++)    {        DList_Free(&poAMPSTimer->poTimerSlotDays[nCounter].poDList, NULL);    }    /*释放定时器句柄*/    AMPS_InternalFree(r_poAMPSContext->pvTimerContext);       TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");}/*****************************************************************函数名称: Timer_FreeNodeData功能描述: 释放定时器结点入参:        void** r_ppvAMPSTimerNodeData 定时器结点数据出参:     --返回值:    int*****************************************************************/int Timer_FreeNodeData(void** r_ppvAMPSTimerNodeData){    t_AMPSTimerNodeData* poAMPSTimerNodeData = *r_ppvAMPSTimerNodeData; if(NULL != poAMPSTimerNodeData){AMPS_InternalFree(poAMPSTimerNodeData);}*r_ppvAMPSTimerNodeData = NULL;return AMPS_SUCCESS;}/*****************************************************************函数名称: Timer_FreeNodeData功能描述: Timer连接事件回调入参:        void* r_pvAMPSContext        void* r_pvAMPSTimer        void* r_pvAMPSNetworkMsg        int r_nPort        char* r_chIPAddress出参:     --返回值:    int*****************************************************************/int Timer_ConnectEvtCallback(void* r_pvAMPSContext, void* r_pvAMPSTimer, void* r_pvAMPSNetworkMsg, int r_nPort, char* r_chIPAddress){t_AMPSContext* poAMPSContext = r_pvAMPSContext;t_AMPSNetworkMsg* poAMPSNetworkMsg = r_pvAMPSNetworkMsg;TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");if(NULL == poAMPSNetworkMsg){TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "error in connection.\n");}else{TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Connected successfully.\n");poAMPSContext->poAMPSNetworkTimerMsgForConnectedSocket = poAMPSNetworkMsg;TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Handle %d.\n", (int)poAMPSNetworkMsg->nHandle);}TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");return AMPS_SUCCESS;}/*****************************************************************函数名称: Timer_CreateTimerConnection功能描述: Timer创建连接入参:        t_AMPSContext* r_poAMPSContext        void* r_pvAMPSTimer        int r_nTimerConnectionListenPort出参:     --返回值:    int*****************************************************************/int Timer_CreateTimerConnection(t_AMPSContext* r_poAMPSContext, void* r_pvAMPSTimer, int r_nTimerConnectionListenPort){t_AMPSTimer* poAMPSTimer = r_pvAMPSTimer;void* pvAMPSNetworkMsg = NULL;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");    /*在环回地址上创建一个socket并绑定指定的port,做为一个非阻塞的时间服务器*///Listener socket to accept Timer connectionTRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Create listener socket to accept Timer connection.\n");if(AMPS_SUCCESS != TCP_InternalCreateNonBlockingListener(r_poAMPSContext, AMPS_MEMORY_SCHEME_STATIC, NULL, NULL, NULL, AMPS_CONNECTION_TYPE_TCP, r_nTimerConnectionListenPort, AMPS_LOOP_BACK_IP_ADDRESS, 0, sizeof(t_AMPSTimerMessage), Timer_ConnectEvtCallback, poAMPSTimer, Timer_RecvDataCallback, &pvAMPSNetworkMsg, NULL)){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalCreateNonBlockingListener failed for timer.\n");return AMPS_ERROR_FAILURE;}    /*设置定时器线程优先级为最高*/if(AMPS_SUCCESS != SAPI_SetThreadSchedFIFOWithPriority(r_poAMPSContext, &poAMPSTimer->oTimerThread, AMPS_PRIORITY_TYPE_MANUAL, 10)){TRACE(TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SAPI_SetThreadSchedRRWithPriority failed.\n");return AMPS_ERROR_FAILURE;}    /*创建线程*/if(AMPS_SUCCESS != SAPI_ThreadCreate(r_poAMPSContext, &poAMPSTimer->oTimerThread, Timer_TickerThread, poAMPSTimer->poAMPSTimerTicker)){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SAPI_ThreadCreate failed.\n");return AMPS_ERROR_FAILURE;}TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");    return AMPS_SUCCESS;}/*****************************************************************函数名称: Timer_StartTimer功能描述: 启动定时器入参:        void* r_pvAMPSContext        unsigned int r_unTimerValue 定时器时长        AMPS_TimeOutNotifyCallBack r_pfAMPS_TimerCallBack 超时处理函数        void* r_pvData出参:     --返回值:    int*****************************************************************/void* Timer_StartTimer(void* r_pvAMPSContext, unsigned int r_unTimerValue, AMPS_TimeOutNotifyCallBack r_pfAMPS_TimerCallBack, void* r_pvData){t_AMPSContext* poAMPSContext = r_pvAMPSContext;    t_AMPSTimer* poAMPSTimer = poAMPSContext->pvTimerContext;    t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL;t_AMPSDList* poDListForTimerSlot = NULL;    if ((unsigned int)poAMPSTimer->nMinTimerValue > r_unTimerValue || (unsigned int)poAMPSTimer->nMaxTimerValue <= r_unTimerValue)    {        TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Invalid Timer Value = %ul.\n", r_unTimerValue);        return NULL;    }    /*分配定时器结点*/    poAMPSTimerNodeData = (t_AMPSTimerNodeData*)AMPS_InternalMalloc(sizeof(t_AMPSTimerNodeData));    if (NULL == poAMPSTimerNodeData)    {        TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc is failed for Timer Node.\n");        return NULL;    }    /*超时处理函数*/     poAMPSTimerNodeData->pfAMPS_TimerCallBack = r_pfAMPS_TimerCallBack;    poAMPSTimerNodeData->pvData = r_pvData;    poAMPSTimerNodeData->chStatus = AMPS_TIMER_STATUS_ENABLE;    poAMPSTimerNodeData->pvAMPSContext = r_pvAMPSContext;TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer value is %d.\n", r_unTimerValue);    /*时长大于1天*/if(AMPS_TIMER_MIN_DAY_SLOT_TIME <= r_unTimerValue){        /*定时器结点中从天到毫秒各链表结点赋值,用来表示当前时长*/poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_DAYS;poAMPSTimerNodeData->unDaysSlotNo = ((poAMPSTimer->unIndexForDaysSlot + (r_unTimerValue/AMPS_TIMER_MIN_DAY_SLOT_TIME)) % AMPS_TIMER_NUM_OF_DAY_SLOTS);poAMPSTimerNodeData->unHoursSlotNo = ((poAMPSTimer->unIndexForHoursSlot + (r_unTimerValue/AMPS_TIMER_MIN_HOUR_SLOT_TIME)) % AMPS_TIMER_NUM_OF_HOUR_SLOTS);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in Hour Slot # %d.\n", poAMPSTimerNodeData->unHoursSlotNo);        if(poAMPSTimerNodeData->unHoursSlotNo  < poAMPSTimer->unIndexForHoursSlot)        {poAMPSTimerNodeData->unDaysSlotNo= ((poAMPSTimerNodeData->unDaysSlotNo+ 1) % AMPS_TIMER_NUM_OF_DAY_SLOTS);        }poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimer->unIndexForMinutesSlot + (r_unTimerValue/AMPS_TIMER_MIN_MINUTE_SLOT_TIME)) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With Minute Slot # %d.\n", poAMPSTimerNodeData->unMinutesSlotNo);        if(poAMPSTimerNodeData->unMinutesSlotNo < poAMPSTimer->unIndexForMinutesSlot)        {poAMPSTimerNodeData->unHoursSlotNo = ((poAMPSTimerNodeData->unHoursSlotNo + 1) % AMPS_TIMER_NUM_OF_HOUR_SLOTS);        }poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimer->unIndexForSecondsSlot + (r_unTimerValue/AMPS_TIMER_MIN_SECOND_SLOT_TIME)) % AMPS_TIMER_NUM_OF_SECOND_SLOTS);    if(poAMPSTimerNodeData->unSecondsSlotNo < poAMPSTimer->unIndexForSecondsSlot)        {poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimerNodeData->unMinutesSlotNo + 1) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS);        }poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots);if(poAMPSTimerNodeData->unMilliSecondsSlotNo < poAMPSTimer->unIndexForMilliSecondsSlot ){poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimerNodeData->unSecondsSlotNo+ 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); }poDListForTimerSlot = poAMPSTimer->poTimerSlotDays[poAMPSTimerNodeData->unDaysSlotNo].poDList;}elseif(AMPS_TIMER_MIN_HOUR_SLOT_TIME <= r_unTimerValue){poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_HOURS;poAMPSTimerNodeData->unHoursSlotNo = ((poAMPSTimer->unIndexForHoursSlot + (r_unTimerValue/AMPS_TIMER_MIN_HOUR_SLOT_TIME)) % AMPS_TIMER_NUM_OF_HOUR_SLOTS);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in Hour Slot # %d.\n", poAMPSTimerNodeData->unHoursSlotNo);poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimer->unIndexForMinutesSlot + (r_unTimerValue/AMPS_TIMER_MIN_MINUTE_SLOT_TIME)) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With Minute Slot # %d.\n", poAMPSTimerNodeData->unMinutesSlotNo);        if(poAMPSTimerNodeData->unMinutesSlotNo < poAMPSTimer->unIndexForMinutesSlot)        {poAMPSTimerNodeData->unHoursSlotNo = ((poAMPSTimerNodeData->unHoursSlotNo + 1) % AMPS_TIMER_NUM_OF_HOUR_SLOTS);        }poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimer->unIndexForSecondsSlot + (r_unTimerValue/AMPS_TIMER_MIN_SECOND_SLOT_TIME)) % AMPS_TIMER_NUM_OF_SECOND_SLOTS);    if(poAMPSTimerNodeData->unSecondsSlotNo < poAMPSTimer->unIndexForSecondsSlot)        {            poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimerNodeData->unMinutesSlotNo + 1) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS);        }poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots);if(poAMPSTimerNodeData->unMilliSecondsSlotNo < poAMPSTimer->unIndexForMilliSecondsSlot ){poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimerNodeData->unSecondsSlotNo+ 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); }poDListForTimerSlot = poAMPSTimer->poTimerSlotHours[poAMPSTimerNodeData->unHoursSlotNo].poDList;}elseif(AMPS_TIMER_MIN_MINUTE_SLOT_TIME <= r_unTimerValue){poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_MINUTES;poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimer->unIndexForMinutesSlot + (r_unTimerValue/AMPS_TIMER_MIN_MINUTE_SLOT_TIME)) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in Minute Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unMinutesSlotNo, poAMPSTimer->unIndexForMinutesSlot);poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimer->unIndexForSecondsSlot + (r_unTimerValue/AMPS_TIMER_MIN_SECOND_SLOT_TIME)) % AMPS_TIMER_NUM_OF_SECOND_SLOTS);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With Second Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unSecondsSlotNo, poAMPSTimer->unIndexForSecondsSlot);if(poAMPSTimerNodeData->unSecondsSlotNo < poAMPSTimer->unIndexForSecondsSlot){            poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimerNodeData->unMinutesSlotNo + 1) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS);}poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots);if(poAMPSTimerNodeData->unMilliSecondsSlotNo < poAMPSTimer->unIndexForMilliSecondsSlot ){poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimerNodeData->unSecondsSlotNo+ 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); }TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With MilliSecond Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unMilliSecondsSlotNo, poAMPSTimer->unIndexForMilliSecondsSlot);poDListForTimerSlot = poAMPSTimer->poTimerSlotMinutes[poAMPSTimerNodeData->unMinutesSlotNo].poDList;}elseif(AMPS_TIMER_MIN_SECOND_SLOT_TIME <= r_unTimerValue){poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_SECONDS;        poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimer->unIndexForSecondsSlot + (r_unTimerValue/AMPS_TIMER_MIN_SECOND_SLOT_TIME)) % AMPS_TIMER_NUM_OF_SECOND_SLOTS);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in Second Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unSecondsSlotNo, poAMPSTimer->unIndexForSecondsSlot);poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With MilliSecond Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unMilliSecondsSlotNo, poAMPSTimer->unIndexForMilliSecondsSlot);if(poAMPSTimerNodeData->unMilliSecondsSlotNo < poAMPSTimer->unIndexForMilliSecondsSlot ){poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimerNodeData->unSecondsSlotNo+ 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); }poDListForTimerSlot = poAMPSTimer->poTimerSlotSeconds[poAMPSTimerNodeData->unSecondsSlotNo].poDList;}else{poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_MILLISECONDS;poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots);TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in MilliSecond Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unMilliSecondsSlotNo, poAMPSTimer->unIndexForMilliSecondsSlot);poDListForTimerSlot = poAMPSTimer->poTimerSlotMilliSeconds[poAMPSTimerNodeData->unMilliSecondsSlotNo].poDList;}    /*增加结点*/poAMPSTimerNodeData->pvSListNodePtr = DList_Prepend(poDListForTimerSlot, poAMPSTimerNodeData);    if (NULL == poAMPSTimerNodeData->pvSListNodePtr)    {        TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SList_Prepend is failed.\n");        AMPS_InternalFree(poAMPSTimerNodeData);    }    return poAMPSTimerNodeData->pvSListNodePtr;}/*****************************************************************函数名称: Timer_DeleteTimer功能描述: 删除定时器入参:        void* r_pvAMPSContext        void* r_pvLinkNode出参:     --返回值:    int*****************************************************************/int Timer_DeleteTimer(void* r_pvAMPSContext, void* r_pvLinkNode){t_AMPSContext* poAMPSContext = r_pvAMPSContext;    t_AMPSTimer* poAMPSTimer = poAMPSContext->pvTimerContext;    t_AMPSSList* poLinkNode = (t_AMPSSList*)r_pvLinkNode;    t_AMPSTimerNodeData* poAMPSTimerNodeData = (t_AMPSTimerNodeData*)poLinkNode->pvData;    /*根据不同时长从不同的定时器链表中删除指定的定时器结点*/if(AMPS_TIMER_CURRENT_SLOT_DAYS == poAMPSTimerNodeData->unCurrentTimerSlot){if(AMPS_SUCCESS != DList_Remove(&poAMPSTimer->poTimerSlotDays[poAMPSTimerNodeData->unDaysSlotNo].poDList, r_pvLinkNode, Timer_FreeNodeData)){TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Remove failed.\n");return AMPS_ERROR_FAILURE;}}elseif(AMPS_TIMER_CURRENT_SLOT_HOURS == poAMPSTimerNodeData->unCurrentTimerSlot){if(AMPS_SUCCESS != DList_Remove(&poAMPSTimer->poTimerSlotHours[poAMPSTimerNodeData->unHoursSlotNo].poDList, r_pvLinkNode, Timer_FreeNodeData)){TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Remove failed.\n");return AMPS_ERROR_FAILURE;}}elseif(AMPS_TIMER_CURRENT_SLOT_MINUTES == poAMPSTimerNodeData->unCurrentTimerSlot){if(AMPS_SUCCESS != DList_Remove(&poAMPSTimer->poTimerSlotMinutes[poAMPSTimerNodeData->unMinutesSlotNo].poDList, r_pvLinkNode, Timer_FreeNodeData)){TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Remove failed.\n");return AMPS_ERROR_FAILURE;}}elseif(AMPS_TIMER_CURRENT_SLOT_SECONDS == poAMPSTimerNodeData->unCurrentTimerSlot){if(AMPS_SUCCESS != DList_Remove(&poAMPSTimer->poTimerSlotSeconds[poAMPSTimerNodeData->unSecondsSlotNo].poDList, r_pvLinkNode, Timer_FreeNodeData)){TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Remove failed.\n");return AMPS_ERROR_FAILURE;}}elseif(AMPS_TIMER_CURRENT_SLOT_MILLISECONDS == poAMPSTimerNodeData->unCurrentTimerSlot){//Timer is in MilliSeconds Slot, so wait for deletionpoAMPSTimerNodeData->chStatus = AMPS_TIMER_STATUS_DISABLE;}return AMPS_SUCCESS;}/*int Timer_TickerThread(void* r_poAMPSContext){    t_AMPSContext* poAMPSContext = r_poAMPSContext;    t_AMPSTimer* poAMPSTimer = poAMPSContext->pvTimerContext;t_AMPSTimerMessage oAMPSTimerMessage = {0};int nReturnValue = AMPS_ERROR_FAILURE;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");//Connected socket to send Timer ticksTRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Create connected socket to send Timer ticks.\n");if(AMPS_SUCCESS != AMPS_InternalCreateBlockingConn(r_poAMPSContext, AMPS_LOOP_BACK_IP_ADDRESS, poAMPSTimer->nTimerConnectionListenPort, AMPS_LOOP_BACK_IP_ADDRESS, NULL, (void**)&poAMPSTimer->poNetworkMessage, NULL)){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalCreateBlockingConn failed.\n");return AMPS_ERROR_FAILURE;}TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Handle %d.\n", (int)poAMPSTimer->poNetworkMessage->nHandle);    while (poAMPSTimer->nTimerIsRunning == AMPS_TRUE)    {oAMPSTimerMessage.unTickCount += 1;        if(AMPS_TIMER_EVENT_TIMEOUT == SAPI_GetNextEvent(r_poAMPSContext, poAMPSTimer->poNetworkMessage->nHandle, poAMPSTimer->nSlotTimeOutInSeconds, poAMPSTimer->nSlotTimeOutInMilliSeconds))        {TRACE(TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Send Msg to Main Thread.\n");nReturnValue = SAPI_SocketWriteBlocking(poAMPSContext, poAMPSTimer->poNetworkMessage, &oAMPSTimerMessage, sizeof(t_AMPSTimerMessage), NULL);if(AMPS_SUCCESS != nReturnValue){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SAPI_SocketWriteBlocking failed.\n");continue;}elseif(AMPS_ERROR_SOCKET_CLOSED == nReturnValue){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Connection is closed from remote side\n");printf("Connection is closed from remote side ....  Connect again .....\n");if(AMPS_SUCCESS != AMPS_InternalCreateBlockingConn(r_poAMPSContext, AMPS_LOOP_BACK_IP_ADDRESS, poAMPSTimer->nTimerConnectionListenPort, AMPS_LOOP_BACK_IP_ADDRESS, NULL, (void**)&poAMPSTimer->poNetworkMessage, NULL)){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalCreateBlockingConn failed.\n");return AMPS_ERROR_FAILURE;}}else{oAMPSTimerMessage.unTickCount = 0;}        }    }    TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");    return AMPS_SUCCESS;}*//*****************************************************************函数名称: Timer_ProcessTimerEvent功能描述: 处理定时器事件入参:        void* r_pvAMPSContext出参:     --返回值:    int*****************************************************************/int Timer_ProcessTimerEvent(void* r_pvAMPSContext){t_AMPSContext* poAMPSContext = r_pvAMPSContext;t_AMPSNetworkMsg* poAMPSNetworkMsg = poAMPSContext->poAMPSNetworkTimerMsgForConnectedSocket;TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");if((NULL != poAMPSNetworkMsg) && (AMPS_FALSE == poAMPSNetworkMsg->bLastOperationPending)){poAMPSNetworkMsg->pfAMPS_SNMReadEvtHandler(poAMPSContext, NULL, poAMPSNetworkMsg);}TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");return AMPS_SUCCESS;}/*****************************************************************函数名称: Timer_ProcessTimerEvent功能描述: 定时器服务器接收数据后处理函数入参:        AMPS_HANDLE r_hAMPS_HANDLE        AMPS_APP_HANDLE r_hAMPS_APP_HANDLE        AMPS_NET_HANDLE r_hAMPS_NET_HANDLE        unsigned char* r_puchBuff        int r_nBuffLength        int r_nPort        char* r_chIPAddress出参:     --返回值:    int*****************************************************************/int Timer_RecvDataCallback(AMPS_HANDLE r_hAMPS_HANDLE, AMPS_APP_HANDLE r_hAMPS_APP_HANDLE, AMPS_NET_HANDLE r_hAMPS_NET_HANDLE, unsigned char* r_puchBuff, int r_nBuffLength, int r_nPort, char* r_chIPAddress){t_AMPSTimerMessage* poAMPSTimerMessage = (t_AMPSTimerMessage*)r_puchBuff;TRACE( TIMER_TRACE_ID(r_hAMPS_HANDLE), AMPS_TRACE_LEVEL_INFO, "Entering.\n");if(sizeof(t_AMPSTimerMessage) != r_nBuffLength){TRACE(TIMER_TRACE_ID(r_hAMPS_HANDLE), AMPS_TRACE_LEVEL_WARNING, "Invalid AMPSTimerMessage size %d.\n", r_nBuffLength);}TRACE( TIMER_TRACE_ID(r_hAMPS_HANDLE), AMPS_TRACE_LEVEL_DEBUG_2, "Timer event is received of size %d and uchCount %d.\n", r_nBuffLength, poAMPSTimerMessage->unTickCount);for( ; 0 < poAMPSTimerMessage->unTickCount; poAMPSTimerMessage->unTickCount--){Timer_ProcessTimerSlot(r_hAMPS_HANDLE, r_hAMPS_APP_HANDLE);}TRACE( TIMER_TRACE_ID(r_hAMPS_HANDLE), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");return AMPS_SUCCESS;}/*****************************************************************函数名称: Timer_ProcessTimerEvent功能描述: 定时器服务器接收数据后处理函数入参:        t_AMPSContext* r_poAMPSContext        t_AMPSTimer* r_poAMPSTimer出参:     --返回值:    int*****************************************************************/void Timer_ProcessTimerSlot(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer){    TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");//process all the slotsTRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Process all the slots.\n");    /*处理并释放毫秒定时器链表中的所有结点*/    DList_FreeNodes(&r_poAMPSTimer->poTimerSlotMilliSeconds[r_poAMPSTimer->unIndexForMilliSecondsSlot].poDList, Timer_ProcessMilliSecondsNodeData);    // set all the countersTRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Set all the counters.\n");r_poAMPSTimer->unIndexForMilliSecondsSlot = (r_poAMPSTimer->unIndexForMilliSecondsSlot + 1) % r_poAMPSTimer->nNoOfMilliSecondsSlots;    /*毫秒定时器链表结点已使用完*/if(r_poAMPSTimer->nNoOfMilliSecondsSlots == (r_poAMPSTimer->unIndexForMilliSecondsSlot + 1)){r_poAMPSTimer->unIndexForSecondsSlot = (r_poAMPSTimer->unIndexForSecondsSlot + 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Current Index for Seconds Slot %d.\n", r_poAMPSTimer->unIndexForSecondsSlot);Timer_ProcessSecondsTimer(r_poAMPSContext, r_poAMPSTimer, r_poAMPSTimer->poTimerSlotSeconds[r_poAMPSTimer->unIndexForSecondsSlot].poDList);if(AMPS_TIMER_NUM_OF_SECOND_SLOTS == (r_poAMPSTimer->unIndexForSecondsSlot + 1)){r_poAMPSTimer->unIndexForMinutesSlot = (r_poAMPSTimer->unIndexForMinutesSlot + 1) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Current Index for Minutes Slot %d.\n", r_poAMPSTimer->unIndexForMinutesSlot);Timer_ProcessMinutesTimer(r_poAMPSContext, r_poAMPSTimer, r_poAMPSTimer->poTimerSlotMinutes[r_poAMPSTimer->unIndexForMinutesSlot].poDList);if(AMPS_TIMER_NUM_OF_MINUTE_SLOTS == (r_poAMPSTimer->unIndexForMinutesSlot + 1)){r_poAMPSTimer->unIndexForHoursSlot = (r_poAMPSTimer->unIndexForHoursSlot + 1) % AMPS_TIMER_NUM_OF_HOUR_SLOTS;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Current Index for Hours Slot %d.\n", r_poAMPSTimer->unIndexForHoursSlot);Timer_ProcessHoursTimer(r_poAMPSContext, r_poAMPSTimer, r_poAMPSTimer->poTimerSlotHours[r_poAMPSTimer->unIndexForHoursSlot].poDList);if(AMPS_TIMER_NUM_OF_HOUR_SLOTS == (r_poAMPSTimer->unIndexForHoursSlot + 1)){r_poAMPSTimer->unIndexForDaysSlot = (r_poAMPSTimer->unIndexForDaysSlot + 1) % AMPS_TIMER_NUM_OF_DAY_SLOTS;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Current Index for Days Slot %d.\n", r_poAMPSTimer->unIndexForDaysSlot);Timer_ProcessDaysTimer(r_poAMPSContext, r_poAMPSTimer, r_poAMPSTimer->poTimerSlotDays[r_poAMPSTimer->unIndexForDaysSlot].poDList);}}}}TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");}/*****************************************************************函数名称: Timer_ProcessDaysTimer功能描述: 处理天定时器入参:        t_AMPSContext* r_poAMPSContext        t_AMPSTimer* r_poAMPSTimer        t_AMPSDList* r_poAMPSDListForDaysTimer出参:     --返回值:    void*****************************************************************/void Timer_ProcessDaysTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForDaysTimer){void* pvAMPSSListCurrentNode = r_poAMPSDListForDaysTimer->poAMPSSListHead;t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");while(pvAMPSSListCurrentNode){poAMPSTimerNodeData = SList_GetNodeData(pvAMPSSListCurrentNode);TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_RemoveWithOutFree called.\n");if(AMPS_SUCCESS != DList_RemoveWithOutFree(r_poAMPSDListForDaysTimer, pvAMPSSListCurrentNode)){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_RemoveWithOutFree failed.\n");}poAMPSTimerNodeData->unDaysSlotNo = 0;poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_HOURS;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_PrependGivenNode called.\n");DList_PrependGivenNode(r_poAMPSTimer->poTimerSlotHours[poAMPSTimerNodeData->unHoursSlotNo].poDList, poAMPSTimerNodeData, pvAMPSSListCurrentNode);pvAMPSSListCurrentNode = r_poAMPSDListForDaysTimer->poAMPSSListHead;}TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");}/*****************************************************************函数名称: Timer_ProcessDaysTimer功能描述: 处理小时定时器入参:        t_AMPSContext* r_poAMPSContext        t_AMPSTimer* r_poAMPSTimer        t_AMPSDList* r_poAMPSDListForDaysTimer出参:     --返回值:    void*****************************************************************/void Timer_ProcessHoursTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForHoursTimer){void* pvAMPSSListCurrentNode = r_poAMPSDListForHoursTimer->poAMPSSListHead;t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");while(pvAMPSSListCurrentNode){poAMPSTimerNodeData = SList_GetNodeData(pvAMPSSListCurrentNode);TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_RemoveWithOutFree called.\n");if(AMPS_SUCCESS != DList_RemoveWithOutFree(r_poAMPSDListForHoursTimer, pvAMPSSListCurrentNode)){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_RemoveWithOutFree failed.\n");}poAMPSTimerNodeData->unHoursSlotNo = 0;poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_MINUTES;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_PrependGivenNode called.\n");DList_PrependGivenNode(r_poAMPSTimer->poTimerSlotMinutes[poAMPSTimerNodeData->unMinutesSlotNo].poDList, poAMPSTimerNodeData, pvAMPSSListCurrentNode);pvAMPSSListCurrentNode = r_poAMPSDListForHoursTimer->poAMPSSListHead;}TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");}/*****************************************************************函数名称: Timer_ProcessDaysTimer功能描述: 处理分定时器入参:        t_AMPSContext* r_poAMPSContext        t_AMPSTimer* r_poAMPSTimer        t_AMPSDList* r_poAMPSDListForDaysTimer出参:     --返回值:    void*****************************************************************/void Timer_ProcessMinutesTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForMinutesTimer){void* pvAMPSSListCurrentNode = r_poAMPSDListForMinutesTimer->poAMPSSListHead;t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");while(pvAMPSSListCurrentNode){poAMPSTimerNodeData = SList_GetNodeData(pvAMPSSListCurrentNode);TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_RemoveWithOutFree called.\n");if(AMPS_SUCCESS != DList_RemoveWithOutFree(r_poAMPSDListForMinutesTimer, pvAMPSSListCurrentNode)){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_RemoveWithOutFree failed.\n");}poAMPSTimerNodeData->unMinutesSlotNo = 0;poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_SECONDS;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_PrependGivenNode called.\n");DList_PrependGivenNode(r_poAMPSTimer->poTimerSlotSeconds[poAMPSTimerNodeData->unSecondsSlotNo].poDList, poAMPSTimerNodeData, pvAMPSSListCurrentNode);pvAMPSSListCurrentNode = r_poAMPSDListForMinutesTimer->poAMPSSListHead;}TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");}/*****************************************************************函数名称: Timer_ProcessDaysTimer功能描述: 处理秒定时器入参:        t_AMPSContext* r_poAMPSContext        t_AMPSTimer* r_poAMPSTimer        t_AMPSDList* r_poAMPSDListForDaysTimer出参:     --返回值:    void*****************************************************************/void Timer_ProcessSecondsTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForSecondsTimer){void* pvAMPSSListCurrentNode = r_poAMPSDListForSecondsTimer->poAMPSSListHead;t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");while(pvAMPSSListCurrentNode){poAMPSTimerNodeData = SList_GetNodeData(pvAMPSSListCurrentNode);TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_RemoveWithOutFree called.\n");if(AMPS_SUCCESS != DList_RemoveWithOutFree(r_poAMPSDListForSecondsTimer, pvAMPSSListCurrentNode)){TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_RemoveWithOutFree failed.\n");}poAMPSTimerNodeData->unSecondsSlotNo = 0;poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_MILLISECONDS;TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_PrependGivenNode called.\n");DList_PrependGivenNode(r_poAMPSTimer->poTimerSlotMilliSeconds[poAMPSTimerNodeData->unMilliSecondsSlotNo].poDList, poAMPSTimerNodeData, poAMPSTimerNodeData->pvSListNodePtr);pvAMPSSListCurrentNode = r_poAMPSDListForSecondsTimer->poAMPSSListHead;}TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");}/*****************************************************************函数名称: Timer_ProcessDaysTimer功能描述: 处理毫秒定时器入参:        t_AMPSContext* r_poAMPSContext        t_AMPSTimer* r_poAMPSTimer        t_AMPSDList* r_poAMPSDListForDaysTimer出参:     --返回值:    void*****************************************************************/int Timer_ProcessMilliSecondsNodeData(void** r_ppvAMPSTimerNodeData){    t_AMPSTimerNodeData* poAMPSTimerNodeData = *r_ppvAMPSTimerNodeData;    t_AMPSContext* poAMPSContext = poAMPSTimerNodeData->pvAMPSContext;    if((NULL != poAMPSTimerNodeData->pfAMPS_TimerCallBack) && (AMPS_TIMER_STATUS_ENABLE == poAMPSTimerNodeData->chStatus))    {TRACE( TIMER_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "poTimerNode->m_pfTimer_TimeoutFunction is called.\n");//printf("poTimerNode->m_pfTimer_TimeoutFunction is called.\n");        /*执行定时器超时函数*/        if (AMPS_SUCCESS != poAMPSTimerNodeData->pfAMPS_TimerCallBack(poAMPSContext, poAMPSTimerNodeData->pvData))        {            TRACE( TIMER_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Timer CallBack is failed.\n");        }//printf("Leaving.\n");    }     else    {        TRACE( TIMER_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_WARNING, "Either Timer is disabled or callback funtion is NULL.\n");    }    AMPS_InternalFree(*r_ppvAMPSTimerNodeData);    *r_ppvAMPSTimerNodeData = NULL;    return AMPS_SUCCESS;}


原创粉丝点击