一个优秀的 ring buffer 或 cycle buffer 的实现代码
#define CIRCLE_BUFFSIZE 1024 * 1024
#define min(x, y) ((x) < (y) ? (x) : (y)) struct cycle_buffer {
unsigned char *buf;
unsigned int size;
unsigned int in;
unsigned int out;
pthread_mutex_t lock;
}; static struct cycle_buffer *fifo = NULL; static int init_cycle_buffer(void)
{
int size = CIRCLE_BUFFSIZE, ret; ret = size & (size - );
if (ret)
return ret;
fifo = (struct cycle_buffer *) malloc(sizeof(struct cycle_buffer));
if (!fifo)
return -; memset(fifo, , sizeof(struct cycle_buffer));
fifo->size = size;
fifo->in = fifo->out = ;
pthread_mutex_init(&fifo->lock, NULL);
fifo->buf = (unsigned char *) malloc(size);
if (!fifo->buf)
free(fifo);
else
memset(fifo->buf, , size);
return ;
}
static int uninit_cycle_buffer(void)
{
if(!fifo)
return -;
pthread_mutex_destroy(&fifo->lock);
if(fifo->buf)
free(fifo->buf);
free(fifo);
}
unsigned int fifo_get(unsigned char *buf, unsigned int len)
{
unsigned int l;
len = min(len, fifo->in - fifo->out);
if(len <= )
return ; l = min(len, fifo->size - (fifo->out & (fifo->size - )));
memcpy(buf, fifo->buf + (fifo->out & (fifo->size - )), l);
memcpy(buf + l, fifo->buf, len - l);
fifo->out += len;
return len;
} unsigned int fifo_put(unsigned char *buf, unsigned int len)
{
unsigned int l;
len = min(len, fifo->size - fifo->in + fifo->out);
l = min(len, fifo->size - (fifo->in & (fifo->size - )));
memcpy(fifo->buf + (fifo->in & (fifo->size - )), buf, l);
memcpy(fifo->buf, buf + l, len - l);
fifo->in += len;
return len;
}
这个实现比较优秀,可自行改成java的实现。
一个优秀的 ring buffer 或 cycle buffer 的实现代码的更多相关文章
- 每天3分钟操作系统修炼秘籍(13):两个缓冲空间Kernel Buffer和IO Buffer
两个缓冲空间:kernel buffer和io buffer 先看一张图,稍后将围绕这张图展开描述.图中的fd table.open file table以及两个inode table都可以不用理解, ...
- NIO中的heap Buffer和direct Buffer区别
在Java的NIO中,我们一般采用ByteBuffer缓冲区来传输数据,一般情况下我们创建Buffer对象是通过ByteBuffer的两个静态方法: ByteBuffer.allocate(int c ...
- 全网最清楚的:MySQL的insert buffer和change buffer 串讲
目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...
- 一个优秀的Unity3d开发者必备的几种设计模式
Unity脚本编程 众所周知,unity的编程属于脚本化,脚本没有一个具体的概念跟架构, 导致在项目过程中,经常出现哪里需要实现什么功能,就随便添加脚本, 结果,就造成了一片混乱,不好管理. 更有甚者 ...
- 一个优秀windows C++程序员的知识体系
思考一个优秀windows C++ 程序员该有哪些知识,可最终发现什么知识都不能少, 看下图: 除了上面知识,程序员还要不断学习, 保持对新知识的热情. 转自http://www.cppblog.co ...
- 一个优秀windows C++程序员的知识体系[转]
转自:一个优秀windows C++程序员的知识体系 思考一个优秀windows C++ 程序员该有哪些知识,可最终发现什么知识都不能少, 看下图: 除了上面知识,程序员还要不断学习, 保持对新知识的 ...
- TinyXML:一个优秀的C++ XML解析器[转]
TinyXML:一个优秀的C++ XML解析器 读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似 ...
- JQuery是继prototype之后又一个优秀的Javascript库
JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Oper ...
- 一个优秀的SEOer必须掌握的三大标配技术
首先,认识网页代码是基础 这里所讲的网页代码是指HTML代码,并不是指复杂的PHP模板技术.一般的培训机构总是提倡学SEO不用学网页代码,只要会购买域名空间搭建网站就行,因为现在的网站模板太丰富了,对 ...
随机推荐
- 洛谷 P10P1343 地震逃生 改错
P1343 地震逃生 题目描述 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有\(n\)个点,\(m\)条边.1号点为教室,\ ...
- jdk8的特性stream().map()
转: https://blog.csdn.net/sanchan/article/details/70753645 java8的optional的使用: http://www.jdon.com/ide ...
- CalISBN.java
/****************************************************************************** * Compilation: javac ...
- pycharm git无法使用问题(待解决)
PyCharm 2017.3.1 (Community Edition)Build #PC-173.3942.36, built on December 14, 2017JRE: 1.8.0_152- ...
- Angular组件生命周期钩子
Angular会按以下顺序依次调用以下钩子(8个): ngOnChanges ngOnInit ngDoCheck ngAfterContentInit ngAfterContentChecked n ...
- Hadoop生态圈-基于yum源的方式部署Cloudera Manager5.15.1
Hadoop生态圈-基于yum源的方式部署Cloudera Manager5.15.1 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我之前分享过关于离线方式部署Cloudera ...
- 函数和常用模块【day04】:函数介绍(一)
本节内容 1.函数介绍 2.函数定义 3.为什么要使用函数 一.介绍 在我们以往的学习编程的过程当中,碰到的最多的两张编程方式或者说编程方法:面向过程和面向对象.其实不管是哪一种,其实都是编程的方法论 ...
- Oracle导出数据中的prompt,set feedback 等是什么意思
prompt 显示后面的提示,相当于一般的操作系统命令echo,输出后面的信息Importing table t_testset feedback off 1.set feedback 有三种方式: ...
- Log4net(二)-——关联配置文件的方式总结
关联配置文件的方式总结 以控制台应用程序为例,在.net mvc项目中默认的配置位置为Web.config,其他的配置都一样 1.配置在AppConfig中 在控制台应用程序中,如果我们把Log4ne ...
- Redis模块学习笔记(一)RediSearch简单使用
说明:安装的Redis服务器必须为 4.0 以上版本,通过info命令查看 > INFO redis_version: 一.安装 RediSearch git clone https://git ...