环形缓冲区(三)

2014-11-24 11:00:32 · 作者: · 浏览: 1
ERR 数据压入环形缓冲区失败 *************************************************************************/ ULONG VOS_PopBuffer(VOID *pRingBuffer, VOID *pFrameBuffer, ULONG *pulFrameBufferLen) { ULONG ulUsedRingBufferSize; ULONG ulFrameBufferLen; TLV_S stTlv; UCHAR *pucCopyEnd; RING_BUFFER_S *pstRingBuffer; /* 函数参数合法性检查 */ if ((NULL_PTR == pRingBuffer) || (NULL_PTR == pFrameBuffer) || (NULL_PTR == pulFrameBufferLen)) { return VOS_ERR; } pstRingBuffer = (RING_BUFFER_S *)pRingBuffer; /* 获取环形缓冲区已用空间 */ ulUsedRingBufferSize = VOS_GetUsedRingBufferSize(pstRingBuffer); /* 环形缓冲区无使用空间,不存在用户数据 */ if (0 == ulUsedRingBufferSize) { return VOS_ERR; } /* 读取TL字段 */ pucCopyEnd = VOS_SmartCopyFromBuffer(pstRingBuffer->aucBuffer, sizeof(pstRingBuffer->aucBuffer), pstRingBuffer->pucReadCursor, (UCHAR *)(&stTlv), SIZE_OF_TL); if (stTlv.ucType != pstRingBuffer->
ucType) { return VOS_ERR; } pstRingBuffer->pucReadCursor = pucCopyEnd; pstRingBuffer->ulUsedBufferSize -= SIZE_OF_TL; /* 读取用户数据 */ ulFrameBufferLen = (stTlv.ucLen1 << 24) + (stTlv.ucLen2 << 16) + (stTlv.ucLen3 << 8) + (stTlv.ucLen4 << 0); pucCopyEnd = VOS_SmartCopyFromBuffer(pstRingBuffer->aucBuffer, sizeof(pstRingBuffer->aucBuffer), pstRingBuffer->pucReadCursor, (UCHAR *)(pFrameBuffer), ulFrameBufferLen); pstRingBuffer->pucReadCursor = pucCopyEnd; pstRingBuffer->ulUsedBufferSize -= ulFrameBufferLen; /* 回填返回数据大小 */ *pulFrameBufferLen = ulFrameBufferLen; return VOS_OK; }