From 6208854726081e53033e66196bc7e52ee02839f1 Mon Sep 17 00:00:00 2001 From: Stas Gurtovoy Date: Sun, 24 Jul 2011 15:09:04 +0300 Subject: [PATCH] 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 --- .../host/libs/libOpenglRender/ReadBuffer.cpp | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/ReadBuffer.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/ReadBuffer.cpp index a08d60109..e80f97a37 100644 --- a/tools/emulator/opengl/host/libs/libOpenglRender/ReadBuffer.cpp +++ b/tools/emulator/opengl/host/libs/libOpenglRender/ReadBuffer.cpp @@ -16,29 +16,48 @@ #include "ReadBuffer.h" #include #include +#include +#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;