c ringbuffer 源码_ringbuffer.c
#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相关推荐
- c ringbuffer 源码_【源码】RingBuffer(一)——生产者
纯CAS为啥比加锁要快? 同样是修改数据,一个采用加锁的方式保证原子性,一个采用CAS的方式保证原子性. 都是能够达到目的的,但是常用的锁(例如显式的Lock和隐式的synchonized),都会把获 ...
- Disruptor源码解析三 RingBuffer解析
目录 系列索引 前言 主要内容 RingBuffer的要点 源码解析 系列索引 Disruptor源码解析一 Disruptor高性能之道 Disruptor源码解析二 Sequence相关类解析 D ...
- disruptor源码阅读与分析---RingBuffer与Sequence
首先,我们还是编写一个测试例子吧,根据测试例子去分析代码更为直观: public static void main(String[] args){EventFactory<EventObject ...
- java disruptor压测_Java并发框架Disruptor实现原理与源码分析(二) 缓存行填充与CAS操作...
##缓存行填充 关于缓存行填充在我个人的印象里面第一次看到是在Java的java.util.concurrent包中,因为当时很好奇其用法背后的逻辑,所以查了很多资料才明白到底是怎么回事*(也许事实上 ...
- disruptor实现细节及源码分析
disruptor实现细节及源码分析 一. 背景介绍 Disruptor它是一个开源的并发框架,并获得 2011 Duke's 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作. ...
- Disruptor 源码阅读笔记--转
原文地址:http://coderbee.net/index.php/open-source/20130812/400 一.Disruptor 是什么? Disruptor 是一个高性能异步处理框架, ...
- 百度开源分布式id生成器uid-generator源码剖析
百度uid-generator源码 https://github.com/baidu/uid-generator snowflake算法 uid-generator是基于Twitter开源的snowf ...
- Go netpoller 网络模型之源码全面解析
作者:allanpan,腾讯 IEG 后台开发工程师 近两万字长文从 Linux 底层 Nonblocking I/O. I/O multiplexing: select/epoll 以及 Go 源码 ...
- 【Canal源码分析】Sink及Store工作过程
一.序列图 二.源码分析 2.1 Sink Sink阶段所做的事情,就是根据一定的规则,对binlog数据进行一定的过滤.我们之前跟踪过parser过程的代码,发现在parser完成后,会把数据放到一 ...
最新文章
- [翻译] AnimatedTransitionGallery
- pandas编写自定义函数高亮显示(highlight)dataframe中的指定内容(数值)(highlighting a specific values or content of a panda
- matlab svd分解
- android 启动服务权限,android – 当我尝试启动服务时权限被拒绝
- Catlike Coding网站文章解析 -- 2.Procedural Grid
- 【清华集训2014】Sum)(类欧几里得算法)
- 作者:沈志宏(1977-),男,博士,中国科学院计算机网络信息中心高级工程师...
- Bootstrap 多级下拉菜单
- matepad和鸿蒙,上手华为新 MatePad Pro :搭载鸿蒙系统后,生产力有何不同?
- 隐藏网络计算机,XP电脑如何在网络中隐藏自己的计算机名称?
- 创业公司的个人“可伸缩性”方案
- XX公司信息化建设草案
- c语言love字符怎么打,怎样利用几行简单的c语言代码表白?
- 《Go语言圣经》阅读笔记:第三章基础数据类型
- 我二刷以上的网文小说,本本经典,值得推荐
- 20162327WJH实验四——图的实现与应用
- Windows 回声消除 怎么外放音乐不让对方听到
- 终于有人把数据安全讲明白了
- 关于日本人的笑话合集(转载)
- 为chrome浏览器单独设置代理服务器