循环缓存类
来源:互联网 发布:微博淘宝客封号 编辑:程序博客网 时间:2024/06/05 22:39
#include "libOSI.h"
#include "libDSI.h"
#ifndef _min_
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef _max_
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
static circular_buffer circularbuffer[MAX_CIRCULAR_BUFFER];
circular_buffer::circular_buffer()
{
}
circular_buffer::~circular_buffer()
{
}
DECLARE OSI_VOID startAllcircular_buffer(OSI_VOID)
{
circular_buffer*pcircularbuffer;
for(OSI_INT32 index = 1;index<=MAX_CIRCULAR_BUFFER;index++)
{
pcircularbuffer = getcircular_bufferObj(index);
pcircularbuffer->Initcircularbuffer();
}
}
OSI_VOID circular_buffer::Initcircularbuffer()
{
m_buffer_size = OSI_1MB;
m_read_p = 0;
m_write_p = 0;
m_circle_buffer = (char*)OSI_Mem_Malloc(OSI_1MB);
OSI_Mem_Set(m_circle_buffer,0,OSI_1MB);
m_beUsed = OSI_FALSE;
}
OSI_VOID circular_buffer::clear()
{
m_read_p = 0;
m_write_p = 0;
m_beUsed = OSI_FALSE;
}
OSI_UINT32 circular_buffer::available()
{
return m_buffer_size - (m_write_p - m_read_p);
}
OSI_UINT32 circular_buffer::used()
{
return m_write_p - m_read_p;
}
OSI_UINT32 circular_buffer::put_data(char * buffer,OSI_UINT32 len)
{
unsigned int l;
OSI_UINT32 writeIndex = m_write_p;
OSI_UINT32 readIndex = m_read_p;
len = _min(len, m_buffer_size - writeIndex + readIndex);
/* first put the data starting from fifo->in to buffer end */
l = _min(len, m_buffer_size - (writeIndex & (m_buffer_size - 1)));
memcpy(m_circle_buffer + (writeIndex & (m_buffer_size - 1)), buffer, l);
/* then put the rest (if any) at the beginning of the buffer */
memcpy(m_circle_buffer, buffer + l, len - l);
//m_write_p += len;
return len;
}
OSI_UINT32 circular_buffer::get_data(char *buffer,OSI_UINT32 len)
{
unsigned int l;
OSI_UINT32 writeIndex = m_write_p;
OSI_UINT32 readIndex = m_read_p;
len = _min(len, writeIndex - readIndex);
/* first get the data from fifo->out until the end of the buffer */
l = _min(len, m_buffer_size - (readIndex & (m_buffer_size - 1)));
memcpy(buffer, m_circle_buffer + (readIndex & (m_buffer_size - 1)), l);
/* then get the rest (if any) from the beginning of the buffer */
memcpy(buffer + l, m_circle_buffer, len - l);
//m_read_p += len;
return len;
}
OSI_UINT32 circular_buffer::_max(OSI_UINT32 a,OSI_UINT32 b)
{
return max(a, b);
}
OSI_UINT32 circular_buffer::_min(OSI_UINT32 a,OSI_UINT32 b)
{
return min(a, b);
}
OSI_UINT32 circular_buffer::ModifyReadIndex(OSI_UINT32 len)
{
m_read_p += len;
//m_read_p = m_read_p%OSI_1MB;
return m_read_p;
}
OSI_UINT32 circular_buffer::ModifyWriteIndex(OSI_UINT32 len)
{
m_write_p +=len;
//m_write_p = m_write_p%OSI_1MB;
return m_write_p;
}
circular_buffer* getcircular_bufferObj(OSI_INT32 index)
{
return &circularbuffer[index-1];
}
#ifndef _CIRCULAR_BUFFER_
#define _CIRCULAR_BUFFER_
#include "libOSI.h"
#include "libDSI.h"
#ifdef cplusplus
extern "C"
{
#endif
/*定义最大的共享缓存数为129*/
#define MAX_CIRCULAR_BUFFER 129
class circular_buffer
{
public:
circular_buffer();
~circular_buffer();
OSI_VOID Initcircularbuffer();
OSI_VOID clear();
OSI_UINT32 available();
OSI_UINT32 used();
OSI_UINT32 put_data(char* buffer, OSI_UINT32 len);
OSI_UINT32 get_data(char* buffer, OSI_UINT32 len);
OSI_BOOL m_beUsed;
protected:
OSI_UINT32 _max(OSI_UINT32 a, OSI_UINT32 b);
OSI_UINT32 _min(OSI_UINT32 a, OSI_UINT32 b);
public:
OSI_INT32 m_buffer_size;
char* m_circle_buffer;
OSI_UINT32 m_write_p;
OSI_UINT32 m_read_p;
OSI_UINT32 m_readIndex;
OSI_UINT32 m_writeIndex;
OSI_UINT32 m_baseaddr;
OSI_UINT32 m_bufsize;
OSI_UINT32 m_pagenum;
OSI_UINT32 m_bar;
OSI_UINT32 m_channum;
};
DECLARE circular_buffer* getcircular_bufferObj(OSI_INT32 index);
DECLARE OSI_VOID startAllcircular_buffer(OSI_VOID);
#ifdef cplusplus
}
#endif
#endif
这个是我自己编写的循环缓存类的实现,已经过测试是好的。
- 循环缓存类
- 多线程的队列循环缓存
- 循环缓存区之C++实现
- 循环缓存区之C++实现
- 缓存类
- 缓存类
- 缓存-生成缓存,读取缓存,删除缓存的类
- ASP循环导入导出数据处理 不使用缓存
- 模仿Linux内核kfifo实现的循环缓存
- 循环队列——实现ringbuffer为了多媒体数据缓存
- 缓存类,支持数据分页缓存
- Xml缓存类,缓存到XML文件
- 缓存技术,封装好的缓存类
- PHP缓存, SimpleCache 类
- ASP缓存类
- 缓存类 转载
- 缓存Cache操作类
- 网站缓存应用类
- 从sourchinsight 到 im
- python super()
- PHP无限树状类
- C#开发COM组件供其他开发环境或工具调用介绍
- 【转】Vim配置文件
- 循环缓存类
- BO常用事件及执行顺序
- Android开源库集锦
- 神童-疯子赵炳文
- svn开机自启设置
- Android开发之下载Tomcat服务器的文件到模拟器的SD卡
- ThinkPHP Ajax分页处理
- 如何阅读文献(二)
- IOS 颜色渐变