Exemplo n.º 1
0
VOS_VOID TAF_SPM_UpdateServiceCtrlEntryMsg(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    TAF_SPM_ENTRY_MSG_STRU             *pstEntryMsg  = VOS_NULL_PTR;
    MSG_HEADER_STRU                    *pstMsgHeader = VOS_NULL_PTR;
    VOS_UINT32                          ulLen;

    /* 获得当前缓存的发送给SS的请求消息的缓冲区地址 */
    pstEntryMsg                 =   TAF_SPM_GetServiceCtrlEntryMsgAddr();
    pstMsgHeader                =   (MSG_HEADER_STRU*)pstMsg;
    ulLen                       =   pstMsgHeader->ulLength + VOS_MSG_HEAD_LENGTH;

    /* 消息长度超过了缓存的长度,则不保存, 防止数组越界 */
    if ( ulLen > TAF_SPM_MAX_MSG_BUFFER_LEN )
    {
        TAF_ERROR_LOG(WUEPS_PID_TAF, "TAF_SPM_UpdateServiceCtrlEntryMsg:Msg too big to save ");
        return ;
    }

    /* 将当前处理的入口消息拷贝到Context对应的缓冲区 */
    PS_MEM_CPY( pstEntryMsg->aucEntryMsgBuffer, pstMsg, ulLen );

    /* 填写Context中的参数 */
    pstEntryMsg->ulEventType    =   ulEventType;

    return;
}
Exemplo n.º 2
0
VOS_UINT32 TAF_SPM_MsgProc(
    struct MsgCB                       *pstSrcMsg,
    struct MsgCB                      **ppstDestMsg
)
{
    VOS_UINT32                          ulEventType;
    VOS_UINT32                          ulRet;
    TAF_SPM_ENTRY_MSG_STRU             *pstEntryMsg     = VOS_NULL_PTR;

    REL_TIMER_MSG                      *pstRcvTimerMsg  = VOS_NULL_PTR;
    MSG_HEADER_STRU                    *pstMsgHeader    = VOS_NULL_PTR;

    pstMsgHeader = (MSG_HEADER_STRU *)pstSrcMsg;

    /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分
        所以此处进行分别处理 */
    if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid)
    {
        pstRcvTimerMsg = (REL_TIMER_MSG *)pstSrcMsg;

        /* 只停止SPM自己的定时器,其它模块定时器在其内部自己停止 */
        if (MN_TIMER_CLASS_SPM == (pstRcvTimerMsg->ulName & MN_TIMER_CLASS_MASK))
        {
            TAF_SPM_StopTimer(pstRcvTimerMsg->ulName,(VOS_UINT16)pstRcvTimerMsg->ulPara);
        }
    }

    ulEventType = TAF_SPM_BuildEventType(pstSrcMsg);

    /* 如果已经预处理完成则直接返回 */
    if (VOS_TRUE == TAF_SPM_PreProcessMsg(ulEventType, pstSrcMsg))
    {
        return VOS_TRUE;
    }

    /* 如果已经处理完成则直接返回 */
    ulRet = TAF_SPM_ProcessMsgInFsm(ulEventType, pstSrcMsg);

    /* 判断是否需要替换入口消息 */
    if (VOS_TRUE == TAF_SPM_GetUpdateEntryMsgFlg())
    {
        pstEntryMsg = TAF_SPM_GetServiceCtrlEntryMsgAddr();
       *ppstDestMsg = (struct MsgCB *)pstEntryMsg->aucEntryMsgBuffer;

        /* 消息已经使用,回复设置标记位,但不能清除消息。  */
        TAF_SPM_SetUpdateEntryMsgFlg(VOS_FALSE);
    }
    else
    {
       *ppstDestMsg = pstSrcMsg;
    }

    /* 继续处理处理 */
    return ulRet;
}