#include "./include/ringbuffer.h"

#include "./include/basictype.h"

#include "./include/sys_dbg.h"

#include

// TODO:

// 1. 暂时未考虑中断的影响

// 2. 读取和写入暂时不支持异步方式

void *RingBuffer_Init(RingBuffer_t *ringBuf, UINT8 *buf, UINT32 bufSize) {

SYS_ASSERT(ringBuf != NULL);

SYS_ASSERT(buf != NULL);

SYS_ASSERT(bufSize > 0);

ringBuf->start = buf;

ringBuf->end = buf + bufSize - 1;

ringBuf->lpos = buf;

ringBuf->rpos = buf;

return (void *)ringBuf;

}

INT32 RingBuffer_Size(RingBuffer_t *ringBuf) {

SYS_ASSERT(ringBuf != NULL);

return (ringBuf->end - ringBuf->start);

}

INT32 RingBuffer_DataLen(RingBuffer_t *ringBuf) {

SYS_ASSERT(ringBuf != NULL);

if (ringBuf->lPos <= ringBuf->rpos) {

return (ringBuf->rpos - ringBuf->lPos);

} else {

INT32 leftSize = ringBuf->rpos - ringBuf->start;

INT32 rightSize = ringBuf->end - ringBuf->lpos + 1;

return (leftSize + rightSize);

}

}

// RingBuffer的剩余空间大小

INT32 RingBuffer_SpaceLen(RingBuffer_t *ringBuf) {

SYS_ASSERT(ringBuf != NULL);

return (RingBuffer_Size(ringBuf) - RingBuffer_DataLen(ringBuf));

}

static INT32 RingBuffer_copyBlock(UINT8 *pDst, UINT8 *pSrc, UINT8 *pSrcLimit) {

SYS_ASSERT(pDst != NULL);

SYS_ASSERT(pSrc != NULL);

SYS_ASSERT(pSrcLimit != NULL);

SYS_ASSERT(pSrc < pSrcLimit);

INT32 copyLen = 0;

while (pSrc < pSrcLimit) {

*pDst++ = *pSrc++;

copyLen++;

}

return copyLen;

}

INT32 RingBuffer_Read(RingBuffer_t *ringBuf, UINT8 *buf, INT32 toReadSize) {

SYS_ASSERT(ringBuf != NULL);

SYS_ASSERT(buf != NULL);

if (!toReadSize)

return 0;

INT32 dataLen = RingBuffer_DataLen(ringBuf);

if (!dataLen)

return 0;

if (toReadSize > dataLen)

toReadSize = dataLen;

if (ringBuf->lpos < ringBuf->rpos) {

memcpy(buf, ringBuf->lpos, toReadSize);

ringBuf->lpos = ringBuf->lpos + toReadSize;

return toReadSize;

} else {

INT32 copyLen;

if ((ringBuf->end - ringBuf->lpos + 1) >= toReadSize) {

copyLen = RingBuffer_copyBlock(buf, ringBuf->lpos, ringBuf->lpos + toReadSize);

ringBuf->lpos += copyLen;

return copyLen;

}

copyLen = RingBuffer_copyBlock(buf, ringBuf->lpos, ringBuf->end + 1);

toReadSize -= copyLen;

buf += copyLen;

copyLen += RingBuffer_copyBlock(buf, ringBuf->start, ringBuf->start + toReadSize);

ringBuf->lpos = ringBuf->start + toReadSize;

return copyLen;

}

}

INT32 RingBuffer_Peek(RingBuffer_t *ringBuf, UINT8 *buf, INT32 peekSize){

SYS_ASSERT(ringBuf != NULL);

SYS_ASSERT(buf != NULL);

if (!peekSize)

return 0;

INT32 dataLen = RingBuffer_DataLen(ringBuf);

if (!dataLen)

return 0;

if (peekSize > dataLen)

peekSize = dataLen;

if (ringBuf->lpos < ringBuf->rpos) {

memcpy(buf, ringBuf->lpos, peekSize);

return peekSize;

} else {

INT32 copyLen;

if ((ringBuf->end - ringBuf->lpos + 1) >= peekSize) {

return RingBuffer_copyBlock(buf, ringBuf->lpos, ringBuf->lpos + peekSize);

}

copyLen = RingBuffer_copyBlock(buf, ringBuf->lpos, ringBuf->end + 1);

peekSize -= copyLen;

buf += copyLen;

copyLen += RingBuffer_copyBlock(buf, ringBuf->start, ringBuf->start + peekSize);

return copyLen;

}

}

INT32 RingBuffer_Write(RingBuffer_t *ringBuf, UINT8 *buf, INT32 toWriteSize) {

SYS_ASSERT(ringBuf != NULL);

SYS_ASSERT(buf != NULL);

if (!toWriteSize)

return 0;

INT32 spaceLen = RingBuffer_SpaceLen(ringBuf);

if(!spaceLen)

return 0;

if (toWriteSize > spaceLen)

toWriteSize = spaceLen;

INT32 copyLen;

if(ringBuf->lpos > ringBuf->rpos){

copyLen = RingBuffer_copyBlock(ringBuf->rpos, buf, buf + toWriteSize);

ringBuf->rpos += ringBuf->rpos + copyLen;

if(ringBuf->rpos>ringBuf->end)

ringBuf->rpos=ringBuf->start;

return copyLen;

}else{

INT32 rLeftSize = ringBuf->end-ringBuf->rpos+1;

if(rLeftSize >= toWriteSize){

copyLen = RingBuffer_copyBlock(ringBuf->rpos, buf, buf + toWriteSize);

ringBuf->rpos += ringBuf->rpos + toWriteSize;

if(ringBuf->rpos > ringBuf->end)

ringBuf->rpos = ringBuf->start;

return copyLen;

}

copyLen = RingBuffer_copyBlock(ringBuf->rpos, buf, buf + rLeftSize);

buf += rLeftSize;

toWriteSize -= copyLen;

copyLen += RingBuffer_copyBlock(ringBuf->start, buf, buf + toWriteSize);

ringBuf->rpos = ringBuf->start + toWriteSize;

if(ringBuf->rpos>ringBuf->end)

ringBuf->rpos=ringBuf->start;

return copyLen;

}

}

void RingBuffer_Reset(RingBuffer_t *ringBuf){

SYS_ASSERT(ringBuf != NULL);

ringBuf->start = NULL;

ringBuf->end = NULL;

ringBuf->lpos = NULL;

ringBuf->rpos = NULL;

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

c ringbuffer 源码_ringbuffer.c相关推荐

  1. c ringbuffer 源码_【源码】RingBuffer(一)——生产者

    纯CAS为啥比加锁要快? 同样是修改数据,一个采用加锁的方式保证原子性,一个采用CAS的方式保证原子性. 都是能够达到目的的,但是常用的锁(例如显式的Lock和隐式的synchonized),都会把获 ...

  2. Disruptor源码解析三 RingBuffer解析

    目录 系列索引 前言 主要内容 RingBuffer的要点 源码解析 系列索引 Disruptor源码解析一 Disruptor高性能之道 Disruptor源码解析二 Sequence相关类解析 D ...

  3. disruptor源码阅读与分析---RingBuffer与Sequence

    首先,我们还是编写一个测试例子吧,根据测试例子去分析代码更为直观: public static void main(String[] args){EventFactory<EventObject ...

  4. java disruptor压测_Java并发框架Disruptor实现原理与源码分析(二) 缓存行填充与CAS操作...

    ##缓存行填充 关于缓存行填充在我个人的印象里面第一次看到是在Java的java.util.concurrent包中,因为当时很好奇其用法背后的逻辑,所以查了很多资料才明白到底是怎么回事*(也许事实上 ...

  5. disruptor实现细节及源码分析

    disruptor实现细节及源码分析 一.     背景介绍 Disruptor它是一个开源的并发框架,并获得 2011 Duke's 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作. ...

  6. Disruptor 源码阅读笔记--转

    原文地址:http://coderbee.net/index.php/open-source/20130812/400 一.Disruptor 是什么? Disruptor 是一个高性能异步处理框架, ...

  7. 百度开源分布式id生成器uid-generator源码剖析

    百度uid-generator源码 https://github.com/baidu/uid-generator snowflake算法 uid-generator是基于Twitter开源的snowf ...

  8. Go netpoller 网络模型之源码全面解析

    作者:allanpan,腾讯 IEG 后台开发工程师 近两万字长文从 Linux 底层 Nonblocking I/O. I/O multiplexing: select/epoll 以及 Go 源码 ...

  9. 【Canal源码分析】Sink及Store工作过程

    一.序列图 二.源码分析 2.1 Sink Sink阶段所做的事情,就是根据一定的规则,对binlog数据进行一定的过滤.我们之前跟踪过parser过程的代码,发现在parser完成后,会把数据放到一 ...

最新文章

  1. [翻译] AnimatedTransitionGallery
  2. pandas编写自定义函数高亮显示(highlight)dataframe中的指定内容(数值)(highlighting a specific values or content of a panda
  3. matlab svd分解
  4. android 启动服务权限,android – 当我尝试启动服务时权限被拒绝
  5. Catlike Coding网站文章解析 -- 2.Procedural Grid
  6. 【清华集训2014】Sum)(类欧几里得算法)
  7. 作者:沈志宏(1977-),男,博士,中国科学院计算机网络信息中心高级工程师...
  8. Bootstrap 多级下拉菜单
  9. matepad和鸿蒙,上手华为新 MatePad Pro :搭载鸿蒙系统后,生产力有何不同?
  10. 隐藏网络计算机,XP电脑如何在网络中隐藏自己的计算机名称?
  11. 创业公司的个人“可伸缩性”方案
  12. XX公司信息化建设草案
  13. c语言love字符怎么打,怎样利用几行简单的c语言代码表白?
  14. 《Go语言圣经》阅读笔记:第三章基础数据类型
  15. 我二刷以上的网文小说,本本经典,值得推荐
  16. 20162327WJH实验四——图的实现与应用
  17. Windows 回声消除 怎么外放音乐不让对方听到
  18. 终于有人把数据安全讲明白了
  19. 关于日本人的笑话合集(转载)
  20. 为chrome浏览器单独设置代理服务器

热门文章

  1. 大华服务器u盘做系统,#测评大玩家#大华P609双接口U盘轻松备份资料
  2. 西门子PLC的局部变量怎么使用
  3. 短信语音双保障,验证通通不是事儿
  4. 自制USB wifi信号放大天线
  5. 教师继续教育 计算机知识,教师继续教育工作总结(拟
  6. Cport 详细解释和应用
  7. 模块化UPS与数据中心供配电架构的发展方向
  8. 程序员从互联网转行公务员:工资一万多变四千,但过得美滋滋
  9. 该如何选择IT培训机构?
  10. mysql 快速导出100万数据_mysql8.0如何快速生成100万数据人员信息数据