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:
committed by
David 'Digit' Turner
parent
8f887e6f08
commit
6208854726
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user