5,530
社区成员
发帖
与我相关
我的任务
分享
class RingBuffer
{
public:
RingBuffer();
~RingBuffer();
//create ring buffer memory
void * CreateAsWriteReader(void * buffer, int bufLen);
void Destroy();
unsigned char *OpenWriteBuffer(int len);
void CloseWriterBuffer();
int ReadPacket(void **data);
void SkipToNextPacket();
private:
int Init(int bufLen);
RingBuffer(const RingBuffer &) {}
void operator=(const RingBuffer&) {}
private:
unsigned char *m_buffer;
unsigned int m_bufferLen;
volatile unsigned int m_readPos;
volatile unsigned int m_writePos;
volatile unsigned int m_newReadPos;
volatile unsigned int m_newWritePos;
};
#define RING_PKT_HEAD_LEN 4
static const int RING_BUFF_PKT_HEAD_LEN = 4;
RingBuffer::RingBuffer()
{
m_buffer = NULL;
m_bufferLen = 0;
m_readPos = 0;
m_writePos = 0;
m_newReadPos = 0;
m_newWritePos = 0;
}
RingBuffer::~RingBuffer()
{
Destroy();
}
void RingBuffer::Destroy()
{
if (m_buffer != NULL)
{
delete []m_buffer;
m_buffer = NULL;
}
}
void *RingBuffer::CreateAsWriteReader(void * buffer, int bufLen)
{
if (Init(6000) == 0)
return m_buffer;
else
return NULL;
}
int RingBuffer::Init(int bufferLen)
{
if (bufferLen <= RING_BUFF_PKT_HEAD_LEN)
return -2;
Destroy();
m_bufferLen = bufferLen;
m_buffer = new unsigned char[m_bufferLen];
if (m_buffer == NULL)
{
return -1;
}
m_readPos = 0;
m_writePos = 0;
m_newReadPos = 0;
m_newWritePos = 0;
return 0;
}
unsigned char* RingBuffer::OpenWriteBuffer(int len)
{
if (m_buffer == NULL || len <= 0)
return NULL;
unsigned int myReadPos = m_readPos;
unsigned int myWritePos = m_writePos;
unsigned int myNewWritePos = myWritePos + RING_BUFF_PKT_HEAD_LEN + len;
//buffer boundary
if(myNewWritePos >= m_bufferLen)
{
*(unsigned int *)(m_buffer+myWritePos) = 0x00;
//buffer full
if(RING_BUFF_PKT_HEAD_LEN + len >= myReadPos)
{
return NULL;
}
myWritePos = 0;
}
//buffer full
myNewWritePos = myWritePos + RING_BUFF_PKT_HEAD_LEN + len;
if(myWritePos < myReadPos && myNewWritePos >= myReadPos)
{
return NULL;
}
unsigned char *data = m_buffer + myWritePos;
*(unsigned int*)data = len;
m_newWritePos = myNewWritePos;
return data + RING_BUFF_PKT_HEAD_LEN;
}
void RingBuffer::CloseWriterBuffer()
{
if (m_buffer == NULL)
return;
m_writePos = m_newWritePos;
return;
}
int RingBuffer::ReadPacket(void **data)
{
if (data == NULL)
return 0;
*data = NULL;
//copy writePos
unsigned int myWritePos = m_writePos;
unsigned int myReadPos = m_readPos;
unsigned int myNewReadPos = myReadPos;
if(myReadPos == myWritePos)
{
return NULL;
}
//
unsigned char *bufferData = (m_buffer + myReadPos);
unsigned int len = *(unsigned int*)bufferData;
if(len == 0)
{
//buff empty
if (0 >= myWritePos)
{
return 0;
}
//
myReadPos = 0;
bufferData = (m_buffer);
len = *(unsigned int*)bufferData;
if(len==0)
{
printf("NG2");
}
}
if (len > 1600)
{
int i = 100;
}
//buff empty
myNewReadPos = myReadPos + RING_BUFF_PKT_HEAD_LEN + len;
if(myReadPos <= myWritePos && myNewReadPos >= myWritePos)
{
return 0;
}
//
m_newReadPos = myNewReadPos;
*data = bufferData + RING_BUFF_PKT_HEAD_LEN;
return len - RING_BUFF_PKT_HEAD_LEN;
}
void RingBuffer::SkipToNextPacket()
{
if (m_buffer == NULL)
return;
m_readPos = m_newReadPos;
return;
}