VOS_VOID* TTF_RING_Q_Out(VOS_UINT32 ulPid, TTF_RING_Q_ST *pstRingQ)
{
    VOS_VOID    *pNode;


    if (VOS_NULL_PTR == pstRingQ ) /* pstRingQ is Null */
    {
        return VOS_NULL_PTR;
    }

    if ( VOS_NULL_PTR == pstRingQ->ppNode) /* pstRingQ is not Initialized ! */
    {
        return VOS_NULL_PTR;
    }

    if ( pstRingQ->ulRear == pstRingQ->ulFront) /* RingQ is Empty */
    {
        return VOS_NULL_PTR;
    }

    pNode               = pstRingQ->ppNode[pstRingQ->ulFront];
    pstRingQ->ulFront   = PS_MOD_ADD(pstRingQ->ulFront, 1, pstRingQ->ulMaxSize);
    return pNode;

} /* TTF_RING_Q_Out */
VOS_UINT32 TTF_RING_Q_In(VOS_UINT32 ulPid, TTF_RING_Q_ST *pstRingQ )
{

    if (VOS_NULL_PTR == pstRingQ ) /* pstRingQ is Null ! */
    {
        return PS_FAIL;
    }

    if ( pstRingQ->ulFront == PS_MOD_ADD(pstRingQ->ulRear, 1, pstRingQ->ulMaxSize) ) /* RingQ is Full ! */
    {
        return PS_FAIL;
    }

    pstRingQ->ulRear  = PS_MOD_ADD(pstRingQ->ulRear, 1, pstRingQ->ulMaxSize);
    return PS_SUCC;

} /* TTF_RING_Q_In */
VOS_UINT32 TTF_RING_Q_IsFull(VOS_UINT32 ulPid, TTF_RING_Q_ST *pstRingQ)
{

    if (VOS_NULL_PTR == pstRingQ ) /* pstRingQ is Null */
    {
        return PS_TRUE;
    }

    if ( pstRingQ->ulFront == PS_MOD_ADD(pstRingQ->ulRear, 1, pstRingQ->ulMaxSize) )
    {
        return PS_TRUE;
    }
    else
    {
        return PS_FALSE;
    }

} /* TTF_RING_Q_IsFull */
VOS_VOID* TTF_RING_Q_Rear(VOS_UINT32 ulPid, TTF_RING_Q_ST *pstRingQ)
{
    VOS_VOID    *pNode;


    if (VOS_NULL_PTR == pstRingQ ) /* pstRingQ is Null ! */
    {
        return VOS_NULL_PTR;
    }

    if ( VOS_NULL_PTR == pstRingQ->ppNode) /* pstRingQ is not Initialized ! */
    {
        return VOS_NULL_PTR;
    }

    if ( pstRingQ->ulFront == PS_MOD_ADD(pstRingQ->ulRear, 1, pstRingQ->ulMaxSize) ) /*  RingQ is Full ! */
    {
        return VOS_NULL_PTR;
    }

    pNode = pstRingQ->ppNode[pstRingQ->ulRear];
    return pNode;

} /* TTF_RING_Q_Rear */
PS_QNODE_STRU* PS_Qnode_GetNode(VOS_UINT16 usFileId,
                                VOS_UINT16 usLineId,
                                VOS_UINT32 ulPid)
{
    PS_QNODE_STRU              *pstQnode = VOS_NULL_PTR;
    VOS_UINT16                  usCurrQnodeIdx;
    VOS_UINT32                  ulTick;
    VOS_INT32                   lLockKey;
    const VOS_UINT16            us32Bit = 32;
    VOS_UINT16                  usStartPos;
    VOS_UINT32                  ulCurr32Bit;
    VOS_UINT16                  usCurrPos;
    VOS_UINT32                  ulTmp;
    VOS_UINT32                  ulLoop;
    const VOS_UINT32            ulMask = 0x80000000;

    ulTick          =   VOS_GetTick();
    usCurrQnodeIdx  =   g_stMgmt.usNodeIdx;
    usStartPos      =   usCurrQnodeIdx / us32Bit;    /* 记录StartPos */
    usCurrPos       =   usStartPos;

    do
    {
        ulCurr32Bit = g_stMgmt.aulQuickMap[usCurrPos];

        if (PS_NULL_UINT32 != ulCurr32Bit)    /* 有值为0的bit, 说明有空位 */
        {
            /* 下边找第一个为1的bit */
            ulTmp   =   ~ulCurr32Bit;

            for (ulLoop = 0; ulLoop < us32Bit; ulLoop++)
            {
                if (ulTmp & ulMask)
                {
                    usCurrQnodeIdx = (VOS_UINT16)(PS_MOD_ADD((usCurrPos * us32Bit), ulLoop, MAX_PS_QNODE_NUM));
                    break;
                }

                ulTmp <<= 1;
            }

            pstQnode    =   &(g_astQnode[usCurrQnodeIdx]);

            lLockKey    =   VOS_SplIMP();

            if (PS_QNODE_FREE_STATE == pstQnode->enState)
            {
                pstQnode->enState               =   PS_QNODE_USED_STATE;

                pstQnode->stDbg.ulAllocTick     =   ulTick;
                pstQnode->stDbg.usAllocFileId   =   usFileId;
                pstQnode->stDbg.usAllocLineNum  =   usLineId;

                /* 刷新快表 */
                TTF_SET_A_BIT(ulCurr32Bit, (us32Bit - ulLoop - 1));
                g_stMgmt.aulQuickMap[usCurrPos] = ulCurr32Bit;

                /* 回写返回节点的索引值 */
                g_stMgmt.usNodeIdx = PS_MOD_ADD(usCurrQnodeIdx, 1, MAX_PS_QNODE_NUM);

                /* 刷新统计 */
                g_stMgmt.stStat.ulAllocTotalCnt++;

                VOS_Splx(lLockKey);

                /* 若正在统计申请情况,需统计到申请总次数 */
                if (PS_TRUE == g_stPsQnodeResetStatInfo.enStartStat)
                {
                    g_stPsQnodeResetStatInfo.usTotalStatCnt++;
                }

                return pstQnode;
            }

            VOS_Splx(lLockKey);
        }

        usCurrPos = PS_MOD_ADD(usCurrPos, 1, MAX_PS_QNODE_4BYTE_ALIGN_NUM);
    }
    while (usCurrPos != usStartPos);

    lLockKey    =   VOS_SplIMP();

    g_stMgmt.stStat.ulAllocFailCnt++;
    g_stMgmt.stStat.ulAllocTotalCnt++;

    VOS_Splx(lLockKey);

    /* 调用该函数,用于判断是否满足主动复位条件 */
    PS_Qnode_ResetGetFailProc(usFileId, usLineId, ulPid);

    TTF_LOG4(ulPid, DIAG_MODE_COMM, PS_PRINT_WARNING, "fileid, line, pid, tick, PS_Qnode_GetNode fail",
        usFileId, usLineId, (VOS_INT32)ulPid, (VOS_INT32)ulTick);

    return VOS_NULL_PTR;
} /* PS_Qnode_GetNode */