现在的位置: 首页 > 综合 > 正文

内核缓冲区应用

2017年08月23日 ⁄ 综合 ⁄ 共 1390字 ⁄ 字号 评论关闭
#include <stdio.h>

#define FIFO_SIZE      (1024)

typedef struct tagS_FIFO
{
    unsigned int ulSize;
    unsigned int ulIn;
    unsigned int ulOut;
    char *pBuf;
}S_FIFO;

int FIFO_min(unsigned int ulFirstDat, unsigned int ulSndValue)
{
    if (ulFirstDat <= ulSndValue)
    {
        return ulFirstDat;
    }
    else
    {
        return ulSndValue;
    }
}

int FIFO_init(S_FIFO *pFifo)
{
    if (NULL == pFifo)
    {
        return -1;
    }

    pFifo->ulSize = FIFO_SIZE;
    pFifo->ulIn = 0;
    pFifo->ulOut = 0;
    pFifo->pBuf = malloc(FIFO_SIZE * sizeof(char));
    if (NULL == pFifo->pBuf)
    {
        return -1;
    }

    return 0;
}

int FIFO_putData(S_FIFO *pFifo, char *pSrc, unsigned int ulLen)
{
    unsigned int ulWrLen = 0;

    if ((NULL == pFifo) || (NULL == pSrc) || (ulLen <= 0))
    {
        return -1;
    }

    /* 首先算出当前剩余空间,然后决定当前能写入的最大长度,其余长度丢弃  */
    ulLen = FIFO_min(ulLen, pFifo->ulSize - pFifo->ulIn + pFifo->ulOut);

    /* 算出没有溢出时,能最大写入的长度,注意没有溢出时,可能需要两次写入 */
    ulWrLen = FIFO_min(ulLen, pFifo->ulSize - (pFifo->ulIn & (pFifo->ulSize -1)));
    memcpy(pFifo->pBuf + (pFifo->ulIn & (pFifo->ulSize -1)), pSrc, ulWrLen);
    memcpy(pFifo->pBuf, pSrc + ulWrLen, ulLen - ulWrLen);
    pFifo->ulIn += ulLen;


    return ulLen;
}

int FIFO_getData(S_FIFO *pFifo, char *pDst, unsigned int ulLen)
{
    unsigned int ulRdLen = 0;

    if ((NULL == pFifo) || (NULL == pDst) || (ulLen <= 0))
    {
        return -1;
    }

    /* 首先算出当前数据空间,然后决定当前能读取的最大长度,其余长度丢弃  */
    ulLen = FIFO_min(ulLen, FIFO->ulIn - FIFO->ulOut);

    /* 算出没有溢出时,能最大读取的长度,注意溢出时,可能需要两次读取 */
    ulRdLen = FIFO_min(ulLen, pFifo->ulSize - (pFifo->ulOut & (pFifo->ulSize -1)));
    memcpy(pDst, FIFO->pBuf + (pFifo-ulOut & (pFifo->ulSize - 1)), ulRdLen);
    memcpy(pDst + ulRdLen, pFifo->pBuf, ulLen - ulRdLen);

    pFifo->ulOut += ulLen;


    return ulLen;
}

抱歉!评论已关闭.