一个环形缓冲(ringbuf)的简单实现

本文详细介绍了环形缓冲(ringbuf)的概念,并通过代码展示了其简单的实现方式,包括如何进行读写操作,以及如何处理满和空的情况。通过对关键部分的注释,帮助读者理解环形缓冲的工作原理及其在内存管理中的应用。
摘要由CSDN通过智能技术生成

代码中有相关注释:

// mybuf.h

#ifndef _RINGBUF_HEADER_
#define _RINGBUF_HEADER_
#ifdef _cplusplus
extern "C"{
#endif

/*************
 1  === succeed
 0  === failed
*************/

typedef struct _ringbuf_ ringbuf;
/******************
  申请的缓冲的大小
  size 为缓冲的大小
 ****************/
ringbuf* ringbuf_create(unsigned int size);

/*************
  往缓冲中放数据

 ****************/

int ringbuf_push(ringbuf* pbuf,const void* data,int size);

/***************
  从缓冲中取数据
 *****************/
int ringbuf_pop(ringbuf* pbuf,void* data,int size);

/*************
从缓冲中取数据 但是不修改缓冲的大小
************/
void* ringbuf_top(ringbuf* pbuf,void* data,int size);

/*******************
移动缓冲的头指针

****************/
int ringbuf_head_move(ringbuf* pbuf,int size);

/***************
如果 size > 0 就是 上面的这个函数
其中size < 0 也是可以的
*************************/

int ringbuf_head_seek(ringbuf* pbuf,int size);

/***************
重新申请缓冲的大小
size 的大小是的最终大小
*******************/
ringbuf* ringbuf_realloc(ringbuf* pbuf,int size);

/*****************
获得buf的大小
******************/
int ringbuf_get_size(ringbuf* pbuf);

/***************
获得缓冲的开始
**************/

#if 1 
void* ringbuf_get_head(ringbuf* pbuf);

/****************
获得当前缓冲的尾部
****************/
void* ringbuf_get_tail(ringbuf* pbuf);


/***************
  销毁缓冲区
 *********************/
void ringbuf_destroy(ringbuf* pbuf);
#endif


#ifdef _cplusplus
}
#endif


#endif

// mybuf.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include "mybuf.h"
#define RINGBUF_START(pbuf) ((unsigned char*)(pbuf->buf_start))
#define RINGBUF_END(pbuf) (pbuf->buf_start+pbuf->buf_size-1)
#define RINGBUF_HEAD(pbuf) (pbuf->buf_head)
#define RINGBUF_TAIL(pbuf) (pbuf->buf_tail)
#define RINGBUF_SIZE(pbuf) (pbuf->buf_size)
#define RINGBUF_USED(pbuf)	(RINGBUF_HEAD(pbuf) <= RINGBUF_TAIL(pbuf) ? RINGBUF_TAIL(pbuf) - RINGBUF_HEAD(pbuf) : RINGBUF_SIZE(pbuf)+RINGBUF_TAIL(pbuf)-RINGBUF_HEAD(pbuf))

#define RINGBUF_FREE(pbuf) (RINGBUF_HEAD(pbuf) <= RINGBUF_TAIL(pbuf) ? RINGBUF_SIZE(pbuf)+RINGBUF_HEAD(pbuf) - RINGBUF_TAIL(pbuf) : RINGBUF_HEAD(pbuf) - RINGBUF_TAIL(pbuf))

struct _ringbuf_
{
	pthread_mutex_t mutex;
	unsigned int buf_size;
	unsigned char* buf_head;
	unsigned char* buf_tail;
	unsigned char buf_start[1];
};

ringbuf* ringbuf_create(unsigned int size)
{
	if(size > 0)
	{
		ringbuf *buf = malloc(sizeof(ringbuf) + size);
		if(buf == NULL)
		{
			return NULL;
		}
		buf->buf_size = size;
		buf->buf_head = buf->buf_tail = buf->buf_start;
		pthread_mutex_init(&buf->mutex,NULL);
		return buf;
	}
	
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值