内核缓冲区应用

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值