`
lancelotwjq
  • 浏览: 54790 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CircleBuffer@glusterfs

 
阅读更多

 

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 环形缓冲区

    环形缓冲区(CircleBuffer),又称为循环缓冲区或环形队列,是一种高效的数据结构,常用于在多个线程间共享数据或者处理实时数据流。它的设计思想是利用一个固定大小的数组,通过两个指针(读指针和写指针)来追踪已...

    CircleBuffer.rar

    环型缓冲区,定义了环型缓冲区结构体,支持定义多个该类型缓冲区。比如串口输入和输出缓冲区,各定义一个环型缓冲区,共用写入和取出的相关函数,代码高效。即使定义100个缓冲区,相关处理函数也不用重复写,只要...

    22. USART_CircleBuffer 串口接收环形缓冲区

    本文将深入探讨如何使用环形缓冲区(Circle Buffer)技术优化STM32的串口接收功能。 串口通信,全称通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),是一种简单但实用的串行通信协议,...

    circlebuffer

    著名的环形缓冲区算法,欢迎大家使用下载,好东西呀。-Well-known ring buffer algorithm, welcome everyone to use the download, you good things.

    CircleBuffer.zip

    在计算机科学中,环形链表常用于实现各种数据结构和算法,例如循环队列、缓存系统、以及在这个场景中的CircleBuffer。 CircleBuffer是一个典型的环形缓冲区实现,主要用于数据的存储和读取。在VC++编程环境中,它常...

    环形数组CircleBuffer.zip

    在"【环形数组】CircleBuffer"这个文件中,可能包含了C和Java两种语言实现环形数组的代码示例,可以作为学习和参考。通过阅读和理解这些代码,你可以更深入地了解环形数组的内部机制和实现细节,从而在实际项目中...

    JAVA多线程实现2个producer和一个Consumer把整数放入到一个环形缓冲Circle Buffer中

    采用2个producer和一个Consumer把整数放入到(或者从中取出)一个环形缓冲Circle Buffer中,这块连续的存储会被反复使用。一个写指针指向数据写入的位置,如果写到Buffer的末端,则从Buffer的头端开始写。类似的,一...

    xm-ring-buffer.tar.gz_RINGBUFFER_XMRING_buffer_circlebuffer_wayr

    环形缓冲区(Ring Buffer),又称为循环缓冲区或圆环缓冲区,是一种高效的数据结构,常用于在多个进程或线程之间共享数据,尤其是在实时系统、嵌入式系统以及多线程编程中。它的核心思想是利用数组的首尾相连特性,...

    一个封装好的C++环形缓冲区

    给定的代码示例展示了一个用C++实现的环形缓冲区类`CircleBuffer`。这个类是模板化的,意味着它可以存储任何类型的元素,只要该类型支持赋值操作。 #### 3. 类成员变量解析 - `ElemType* Arr`: 指向实际存储数据的...

    环形缓冲区 封装模板类

    模板类名:CircleBuffer 功 能:环形缓冲区 优 点:相对于队列来说减少了很多对地址的反复操作,增加稳定性。 作 者:XadillaX Q Q:8644325 说 明: | 构造: CircleBuffer&lt;类型名&gt; //构造时可选参数环形缓冲区...

    基于 C 实现的环形数组(环形数组的实现)

    CircleBuffer* buffer = (CircleBuffer*)malloc(sizeof(CircleBuffer)); if (!buffer) return NULL; buffer-&gt;data = (int*)malloc(size * sizeof(int)); if (!buffer-&gt;data) { free(buffer); return NULL; }...

    is-buffer:判断一个对象是否是一个缓冲区

    此模块可以检查如果一个对象是一个Buffer ,而不使用Buffer.isBuffer (其包括整个模块 )。 它是面向未来的,也适用于节点! 安装 npm install is-buffer 用法 var isBuffer = require ( 'is-buffer' ) isBuffer...

    circularBuffer:来自 MATLAB 的向量/矩阵子类内置于类“double”中,用于循环缓冲区-matlab开发

    'circularBuffer' 类将常规 MATLAB 向量/矩阵转换为圆形向量/矩阵。 在访问/改变 circleBuffer 对象中的元素时,用户指定的索引将被包装成有效的索引。 所有 MATLAB 向量/矩阵运算也适用于 circleBuffer 对象!

    Distributed-DRL:分布式深度强化学习

    # 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语言头文件 BUFFER

    C语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC语言头文件 BUFFERC...

    基于ACE的环形buffer

    7. **文件`circle_buffer`**:这个文件可能是源代码、文档或者是测试用例,详细展示了如何使用ACE库构建环形buffer,包括其内部结构、接口设计以及与TCP的交互方式。 总之,"基于ACE的环形buffer"是一个利用ACE库...

    Buffer.zip_buffer

    在IT行业中,Buffer是计算机内存管理中的一个重要概念,特别是在处理数据读写操作时。Buffer.zip_buffer这个标题可能指的是一个特定的缓冲区实现,它被设计用于VC(Visual C++)环境,但经过修改以实现跨平台兼容性...

    ZBuffer扫描线

    ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线 ZBuffer 扫描线

    c语言实现循环buffer

    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 3.0 C++

    Protocol Buffer是Google开发的一种数据序列化协议,它允许开发者定义数据结构,并将其转换为二进制格式进行存储或网络传输。Protocol Buffer 3.0 (简称protobuf) 是该技术的第三个主要版本,提供了更强大的功能和...

Global site tag (gtag.js) - Google Analytics