标签:style blog io ar sp 数据 on 2014 log
cirbuf.h
#ifndef _Cirbuf_h
#define _Cirbuf_h
#include <pthread.h>
#define size_t int
struct Cirbuf
{
unsigned char *mp_buf;
size_t m_buf_size;
size_t m_write, m_read;
pthread_mutex_t mut_cirbuf;
};
typedef struct Cirbuf mCirbuf;
struct Cirbuf *util_cbuf_create (size_t size);
void util_cbuf_release (struct Cirbuf *buf);
size_t util_cbuf_space (struct Cirbuf *buf);
size_t util_cbuf_data (struct Cirbuf *buf);
size_t util_cbuf_contiguous_data (struct Cirbuf *buf);
void *util_cbuf_get_contiguous_data (struct Cirbuf *buf);
size_t util_cbuf_get_cdata (struct Cirbuf *buf, void **data);
void util_cbuf_save (struct Cirbuf *buf, const void *data, size_t len);
void util_cbuf_consume (struct Cirbuf *buf, size_t cnt);
void popdata (struct Cirbuf *cbuf, void *buf, size_t len);
#endif
</span>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cirbuf.h"
#define CNT_DATA(write, read, size) (((write)-(read)) & ((size)-1))
#define CNT_SPACE(write, read, size) CNT_DATA((read), ((write)+1), (size))
//已有数据
static size_t DATA_TO_END(size_t write, size_t read, size_t size)
{
size_t end = size - read;
size_t n = (write + end) & (size - 1);
return n < end ? n : end;
}
//剩余空间
static size_t SPACE_TO_END(size_t write, size_t read, size_t size)
{
size_t end = size - 1 - write;
size_t n = (read + end) & (size - 1);
return n <= end ? n : end+1;
}
struct Cirbuf *util_cbuf_create (size_t size)
{
struct Cirbuf *buf = (struct Cirbuf*)malloc(sizeof(struct Cirbuf));
buf->mp_buf = (unsigned char*)malloc(size);
buf->m_buf_size = size;
buf->m_read = 0;
buf->m_write = 0;
pthread_mutex_init(&buf->mut_cirbuf,NULL);
return (struct Cirbuf*)buf;
}
void util_cbuf_release (struct Cirbuf *buf)
{
struct Cirbuf *b = (struct Cirbuf*)buf;
free(b->mp_buf);
free(b);
}
size_t util_cbuf_space (struct Cirbuf *buf)
{
struct Cirbuf *b = (struct Cirbuf*)buf;
return CNT_SPACE(b->m_write, b->m_read, b->m_buf_size);
}
size_t util_cbuf_data (struct Cirbuf *buf)
{
struct Cirbuf *b = (struct Cirbuf*)buf;
return CNT_DATA(b->m_write, b->m_read, b->m_buf_size);
}
size_t util_cbuf_contiguous_data (struct Cirbuf *buf)
{
struct Cirbuf *b = (struct Cirbuf *)buf;
return DATA_TO_END(b->m_write, b->m_read, b->m_buf_size);
}
void *util_cbuf_get_contiguous_data (struct Cirbuf *buf)
{
struct Cirbuf *b = (struct Cirbuf*)buf;
return b->mp_buf + b->m_read;
}
size_t util_cbuf_get_cdata (struct Cirbuf *buf, void **data)
{
struct Cirbuf *b = (struct Cirbuf*)buf;
*data = b->mp_buf + b->m_read;
return DATA_TO_END(b->m_write, b->m_read, b->m_buf_size);
}
void util_cbuf_save (struct Cirbuf *buf, const void *data, size_t len)
{
struct Cirbuf *b = (struct Cirbuf*)buf;
size_t c;
if(len > util_cbuf_space(buf))
{
printf("ERROR util_cbuf_save\n");
}
c = SPACE_TO_END(b->m_write, b->m_read, b->m_buf_size);
if (c >= len) {
memcpy(b->mp_buf+b->m_write, data, len);
}
else {
unsigned char *src = (unsigned char*)data+c;
memcpy(b->mp_buf+b->m_write, data, c);
memcpy(b->mp_buf, src, (len-c));
}
b->m_write += len;
b->m_write &= (b->m_buf_size-1);
}
//从队首清空cnt个数据
void util_cbuf_consume (struct Cirbuf *buf, size_t cnt)
{
struct Cirbuf *b = (struct Cirbuf*)buf;
if(cnt > util_cbuf_data(buf))
{
printf("ERROR util_cbuf_consume\n");
}
b->m_read += cnt;
b->m_read &= (b->m_buf_size-1);
}
// 从 cbuf 中提取数据
void popdata (struct Cirbuf *cbuf, void *buf, size_t len)
{
if(util_cbuf_data(cbuf) < len)
{
printf("ERROR popdata %d < %d\n",util_cbuf_data(cbuf),len);
}
void *pdata;
size_t csize = util_cbuf_get_cdata(cbuf, &pdata);
if (csize >= len) {
memcpy(buf, pdata, len);
util_cbuf_consume(cbuf, len);
}
else
{
memcpy(buf, pdata, csize);
util_cbuf_consume(cbuf, csize);
buf = (unsigned char*)buf + csize;
len -= csize;
csize = util_cbuf_get_cdata(cbuf, &pdata);
memcpy(buf, pdata, len);
util_cbuf_consume(cbuf, len);
}
}标签:style blog io ar sp 数据 on 2014 log
原文地址:http://blog.csdn.net/u012377333/article/details/41382069