CircleBuffer
是逻辑上呈环形的缓冲区
。 当缓冲区满了的时候可以让新的数据覆盖最旧的数据。
Glusterfs使用CircleBuffer来存储Afr的自修复日志。
CircleBuffer在 libglusterfs/src/circ-buff.c
中定义:
下面介绍下其关键函数 __cb_add_entry_buffer (buffer_t *buffer, void *item)
该函数负责添加一个buffer到环中:
//当环满了时候
if (buffer->used_len == buffer->size_buffer) {
//w_index始终指向下一个写的位置
//如果这个位置不是空的,那么需要先释放空间
if (buffer->cb[buffer->w_index]) {
ptr = buffer->cb[buffer->w_index];
if (ptr->data) {
GF_FREE (ptr->data);
ptr->data = NULL;
GF_FREE (ptr);
}
buffer->cb[buffer->w_index] = NULL;
ptr = NULL;
}
}
//申请空间
buffer->cb[buffer->w_index] =
GF_CALLOC (1, sizeof (circular_buffer_t),
gf_common_mt_circular_buffer_t);
if (!buffer->cb[buffer->w_index])
return -1;
//data指针指向外部数据
buffer->cb[buffer->w_index]->data = item;
//记录时间
ret = gettimeofday (&buffer->cb[buffer->w_index]->tv, NULL);
if (ret == -1)
gf_log_callingfn ("", GF_LOG_WARNING, "getting time of"
"the day failed");
//计算下一个写位置,因为是环状的所以需要使用模运算
buffer->w_index++;
buffer->w_index %= buffer->size_buffer - 1;
//used_buffer size cannot be greater than the total buffer size
//如果环未满,则已使用长度+1, 满了就不用加了。
if (buffer->used_len < buffer->size_buffer)
buffer->used_len++;
return buffer->w_index;
event-history.c封装了Circle-Buf来实现事件的历史记录功能。
分享到:
相关推荐
环形缓冲区(CircleBuffer),又称为循环缓冲区或环形队列,是一种高效的数据结构,常用于在多个线程间共享数据或者处理实时数据流。它的设计思想是利用一个固定大小的数组,通过两个指针(读指针和写指针)来追踪已...
环型缓冲区,定义了环型缓冲区结构体,支持定义多个该类型缓冲区。比如串口输入和输出缓冲区,各定义一个环型缓冲区,共用写入和取出的相关函数,代码高效。即使定义100个缓冲区,相关处理函数也不用重复写,只要...
本文将深入探讨如何使用环形缓冲区(Circle Buffer)技术优化STM32的串口接收功能。 串口通信,全称通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),是一种简单但实用的串行通信协议,...
著名的环形缓冲区算法,欢迎大家使用下载,好东西呀。-Well-known ring buffer algorithm, welcome everyone to use the download, you good things.
在计算机科学中,环形链表常用于实现各种数据结构和算法,例如循环队列、缓存系统、以及在这个场景中的CircleBuffer。 CircleBuffer是一个典型的环形缓冲区实现,主要用于数据的存储和读取。在VC++编程环境中,它常...
在"【环形数组】CircleBuffer"这个文件中,可能包含了C和Java两种语言实现环形数组的代码示例,可以作为学习和参考。通过阅读和理解这些代码,你可以更深入地了解环形数组的内部机制和实现细节,从而在实际项目中...
采用2个producer和一个Consumer把整数放入到(或者从中取出)一个环形缓冲Circle Buffer中,这块连续的存储会被反复使用。一个写指针指向数据写入的位置,如果写到Buffer的末端,则从Buffer的头端开始写。类似的,一...
环形缓冲区(Ring Buffer),又称为循环缓冲区或圆环缓冲区,是一种高效的数据结构,常用于在多个进程或线程之间共享数据,尤其是在实时系统、嵌入式系统以及多线程编程中。它的核心思想是利用数组的首尾相连特性,...
给定的代码示例展示了一个用C++实现的环形缓冲区类`CircleBuffer`。这个类是模板化的,意味着它可以存储任何类型的元素,只要该类型支持赋值操作。 #### 3. 类成员变量解析 - `ElemType* Arr`: 指向实际存储数据的...
模板类名:CircleBuffer 功 能:环形缓冲区 优 点:相对于队列来说减少了很多对地址的反复操作,增加稳定性。 作 者:XadillaX Q Q:8644325 说 明: | 构造: CircleBuffer<类型名> //构造时可选参数环形缓冲区...
CircleBuffer* buffer = (CircleBuffer*)malloc(sizeof(CircleBuffer)); if (!buffer) return NULL; buffer->data = (int*)malloc(size * sizeof(int)); if (!buffer->data) { free(buffer); return NULL; }...
此模块可以检查如果一个对象是一个Buffer ,而不使用Buffer.isBuffer (其包括整个模块 )。 它是面向未来的,也适用于节点! 安装 npm install is-buffer 用法 var isBuffer = require ( 'is-buffer' ) isBuffer...
'circularBuffer' 类将常规 MATLAB 向量/矩阵转换为圆形向量/矩阵。 在访问/改变 circleBuffer 对象中的元素时,用户指定的索引将被包装成有效的索引。 所有 MATLAB 向量/矩阵运算也适用于 circleBuffer 对象!
# replay buffer @ ray . remote class ParameterServer ( object ): ... # keep the newest network weights here # could pull and push the weights # also could save the weights to local @ ray . ...
C语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC...
7. **文件`circle_buffer`**:这个文件可能是源代码、文档或者是测试用例,详细展示了如何使用ACE库构建环形buffer,包括其内部结构、接口设计以及与TCP的交互方式。 总之,"基于ACE的环形buffer"是一个利用ACE库...
在IT行业中,Buffer是计算机内存管理中的一个重要概念,特别是在处理数据读写操作时。Buffer.zip_buffer这个标题可能指的是一个特定的缓冲区实现,它被设计用于VC(Visual C++)环境,但经过修改以实现跨平台兼容性...
ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线
4. 检查缓冲区状态:`int cyclic_buffer_empty(cyclic_buffer_t* buffer)`和`int cyclic_buffer_full(cyclic_buffer_t* buffer)`分别判断缓冲区是否为空或已满。 5. 清空缓冲区:`void cyclic_buffer_clear(cyclic_...
Protocol Buffer是Google开发的一种数据序列化协议,它允许开发者定义数据结构,并将其转换为二进制格式进行存储或网络传输。Protocol Buffer 3.0 (简称protobuf) 是该技术的第三个主要版本,提供了更强大的功能和...