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 */