opengles emulator: dynamicaly grow ReadBuffer

In case we're receiving packets larger then the initial size
of the read buffer, we dynamicaly grow (X2 steps) the size of
the buffer. An example for this large buffer is a 4MB texture
in JetCarStunts.

Change-Id: I167caddb731583811c009321d4f8fb2f7eea032c
This commit is contained in:
Stas Gurtovoy
2011-07-24 15:09:04 +03:00
committed by David 'Digit' Turner
parent 8f887e6f08
commit 6208854726

View File

@@ -16,29 +16,48 @@
#include "ReadBuffer.h"
#include <string.h>
#include <assert.h>
#include <limits.h>
#include "ErrorLog.h"
ReadBuffer::ReadBuffer(IOStream *stream, size_t bufsize)
{
m_size = bufsize;
m_stream = stream;
m_buf = new unsigned char[m_size];
m_buf = (unsigned char*)malloc(m_size*sizeof(unsigned char));
m_validData = 0;
m_readPtr = m_buf;
}
ReadBuffer::~ReadBuffer()
{
delete m_buf;
free(m_buf);
}
int ReadBuffer::getData()
{
if (m_validData > 0) {
if ((m_validData > 0) && (m_readPtr > m_buf)) {
memcpy(m_buf, m_readPtr, m_validData);
}
m_readPtr = m_buf;
// get fresh data into the buffer;
size_t len = m_size - m_validData;
if (len==0) {
//we need to inc our buffer
size_t new_size = m_size*2;
unsigned char* new_buf;
if (new_size < m_size) { // overflow check
new_size = INT_MAX;
}
new_buf = (unsigned char*)realloc(m_buf, new_size);
if (!new_buf) {
ERR("Failed to alloc %d bytes for ReadBuffer\n", new_size);
return -1;
}
m_size = new_size;
m_buf = new_buf;
len = m_size - m_validData;
}
m_readPtr = m_buf;
if (NULL != m_stream->read(m_buf + m_validData, &len)) {
m_validData += len;
return len;