七、内存管理之循环buf

loopbuf.h

typedef struct {
	unsigned char         stat;
#define LOOPBUF_STA_ALLOCED             0x01          // 内存是否已经分配
#define LOOPBUF_STA_ENDWRIT             0x02          // 写入是否完成

	unsigned int        size;
	char            *dat;
	unsigned  int       ridx;
	unsigned  int      widx;
} loopbuf_t;

void loopbuf_init(loopbuf_t *lbuf);
int loopbuf_alloc(loopbuf_t *lbuf, int size);
int loopbuf_alloc2(loopbuf_t *lbuf, int size, void *addr);
void loopbuf_free(loopbuf_t *lbuf);
void loopbuf_free2(loopbuf_t *lbuf);
int loopbuf_write(loopbuf_t *lbuf, void *dat, int len);
void loopbuf_write_end(loopbuf_t *lbuf);
bool loopbuf_write_is_end(loopbuf_t *lbuf);
int loopbuf_read(loopbuf_t *lbuf, void *dat, int len);
int loopbuf_get_size(loopbuf_t *lbuf);
unsigned loopadd(unsigned a, unsigned b, unsigned s);
unsigned loopsub(unsigned a, unsigned b, unsigned s);

loopbuf.c

void loopbuf_init(loopbuf_t *lbuf)
{
	lbuf->stat = 0;
	lbuf->dat = NULL;
}

int loopbuf_alloc(loopbuf_t *lbuf, int size)
{
	if (!lbuf->dat) {
		lbuf->dat = (char *)malloc(size);
		if (!lbuf->dat)
			return -ENOMEM;
	}

	lbuf->size = size;
	lbuf->stat |= LOOPBUF_STA_ALLOCED;
	return size;
}

int loopbuf_alloc2(loopbuf_t *lbuf, int size, void *addr)
{
	if (!lbuf->dat)
		lbuf->dat = addr;

	lbuf->size = size;
	lbuf->stat |= LOOPBUF_STA_ALLOCED;
	return size;
}

void loopbuf_free(loopbuf_t *lbuf)
{
	free(lbuf->dat);
	lbuf->dat = NULL;
	lbuf->stat = 0;
}

void loopbuf_free2(loopbuf_t *lbuf)
{
	lbuf->dat = NULL;
	lbuf->stat = 0;
}

void loopbuf_reset(loopbuf_t *lbuf)
{
	lbuf->stat &= ~LOOPBUF_STA_ENDWRIT;
	lbuf->widx = 0;
	lbuf->ridx = 0;
}

int loopbuf_write(loopbuf_t *lbuf, void *dat, int len)
{
	unsigned cnt;
	unsigned ridx = lbuf->ridx;
	unsigned cur_len;//当前可写的长度

	if (lbuf->stat & LOOPBUF_STA_ENDWRIT)
		return -ENOMEM;

	if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
		return -ENOMEM;

	cur_len = loopsub(ridx, lbuf->widx, lbuf->size);
	cur_len = loopsub(cur_len, 1, lbuf->size); 

	if (cur_len < len)
		return -EBUSY;

	cnt = lbuf->size - lbuf->widx;

	if (len > cnt) {
		memcpy(lbuf->dat + lbuf->widx, dat, cnt);
		memcpy(lbuf->dat, (char *)dat + cnt, len - cnt);
	} else
		memcpy(lbuf->dat + lbuf->widx, dat, len);

	lbuf->widx = (lbuf->widx + len) % lbuf->size;

	return len;
}

void loopbuf_write_end(loopbuf_t *lbuf)
{
	lbuf->stat |= LOOPBUF_STA_ENDWRIT;
}

bool loopbuf_write_is_end(loopbuf_t *lbuf)
{
	if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
		return -ENOMEM;

	return (lbuf->stat & LOOPBUF_STA_ENDWRIT) ? 1 : 0;
}

int loopbuf_check(loopbuf_t *lbuf)
{
	if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
		return -ENOMEM;

	return loopsub(lbuf->widx, lbuf->ridx, lbuf->size);
}

int loopbuf_read(loopbuf_t *lbuf, void *dat, int len)
{
	unsigned cnt;
	unsigned widx = lbuf->widx;
	unsigned cur_len;

	if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
		return -ENOMEM;

	cur_len = loopsub(widx, lbuf->ridx, lbuf->size);

	if ((!cur_len) && (lbuf->stat & LOOPBUF_STA_ENDWRIT))
		return 0;

	if (cur_len < len) {
		if (lbuf->stat & LOOPBUF_STA_ENDWRIT)
			len = cur_len;
		else
			return -EBUSY;
	}

	cnt = lbuf->size - lbuf->ridx;

	if (len > cnt) {
		memcpy(dat, lbuf->dat + lbuf->ridx, cnt);
		memcpy((char *)dat + cnt, lbuf->dat, len - cnt);
	} else
		memcpy(dat, lbuf->dat + lbuf->ridx, len);

	lbuf->ridx = (lbuf->ridx + len) % lbuf->size;

	return len;
}

int loopbuf_get_size(loopbuf_t *lbuf)
{
	if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
		return -ENOMEM;

	return loopsub(lbuf->widx, lbuf->ridx, lbuf->size);
}
unsigned loopadd(unsigned a, unsigned b, unsigned s)
{
	if ((a + b) > s)
		return a + b -s;
	else
		return a + b;
}

unsigned loopsub(unsigned a, unsigned b, unsigned s)
{
	if (a < b)
		return a + s - b;
	else
		return a - b;
}

main.c

#define MY_EXCBUF_SIZE                 (32000)
static char my_excbuf[MY_EXCBUF_SIZE + 1];
loopbuf_t       excbuf;                 // data exchange buffer

u8 tmp[MY_EXCBUF_SIZE+1] = { 0 };//写测试BUF

int _tmain(int argc, _TCHAR* argv[])
{
	int ret;
	memset(tmp, 5, 1000);
	loopbuf_init(&excbuf);
	if (loopbuf_alloc2(&excbuf, MY_EXCBUF_SIZE + 1, my_excbuf) < 0) {
		ret = -1;
		printf("loopbuf_alloc2 失败 ret = %d\r\n", ret);
	}
	ret = loopbuf_write(&excbuf, tmp, 1000);
	printf("当前写入多少数据 ret = %d\r\n",ret);
	if (ret < 0) {
		printf("*");
	}
	ret = loopbuf_write(&excbuf, tmp, 1000);
	printf("当前写入多少数据 ret = %d\r\n", ret);
	if (ret < 0) {
		printf("*");
	}
	ret = loopbuf_get_size(&excbuf);
	printf("总共写入多少数据 ret1 = %d\r\n", ret);
	system("Pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值