mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
Use a circular buffer for getReturnBuffer because StringStack's would get clobbered too quickly
This commit is contained in:
parent
3650e9afa9
commit
ff9892c11e
|
|
@ -41,6 +41,7 @@
|
|||
#include "core/frameAllocator.h"
|
||||
|
||||
#include "console/codeInterpreter.h"
|
||||
#include "console/returnBuffer.h"
|
||||
|
||||
#ifndef TORQUE_TGB_ONLY
|
||||
#include "materials/materialDefinition.h"
|
||||
|
|
@ -101,17 +102,17 @@ F64 consoleStringToNumber(const char *str, StringTableEntry file, U32 line)
|
|||
|
||||
namespace Con
|
||||
{
|
||||
ReturnBuffer retBuffer;
|
||||
|
||||
char *getReturnBuffer(U32 bufferSize)
|
||||
|
||||
{
|
||||
return STR.getReturnBuffer(bufferSize);
|
||||
return retBuffer.getBuffer(bufferSize);
|
||||
}
|
||||
|
||||
char *getReturnBuffer(const char *stringToCopy)
|
||||
{
|
||||
U32 len = dStrlen(stringToCopy) + 1;
|
||||
char *ret = STR.getReturnBuffer(len);
|
||||
char *ret = retBuffer.getBuffer(len);
|
||||
dMemcpy(ret, stringToCopy, len);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -119,7 +120,7 @@ namespace Con
|
|||
char* getReturnBuffer(const String& str)
|
||||
{
|
||||
const U32 size = str.size();
|
||||
char* ret = STR.getReturnBuffer(size);
|
||||
char* ret = retBuffer.getBuffer(size);
|
||||
dMemcpy(ret, str.c_str(), size);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
83
Engine/source/console/returnBuffer.cpp
Normal file
83
Engine/source/console/returnBuffer.cpp
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (c) 2012 GarageGames, LLC
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "returnBuffer.h"
|
||||
|
||||
ReturnBuffer::ReturnBuffer()
|
||||
{
|
||||
mBuffer = nullptr;
|
||||
mBufferSize = 0;
|
||||
mStart = 0;
|
||||
|
||||
//Decent starting alloc of ~1 page = 4kb
|
||||
ensureSize(4 * 1024);
|
||||
}
|
||||
|
||||
ReturnBuffer::~ReturnBuffer()
|
||||
{
|
||||
if (mBuffer)
|
||||
{
|
||||
dFree(mBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
void ReturnBuffer::ensureSize(U32 newSize)
|
||||
{
|
||||
//Round up to nearest multiple of 16 bytes
|
||||
if (newSize & 0xF)
|
||||
{
|
||||
newSize = (newSize & ~0xF) + 0x10;
|
||||
}
|
||||
if (mBuffer == NULL)
|
||||
{
|
||||
//First alloc
|
||||
mBuffer = (char *)dMalloc(newSize * sizeof(char));
|
||||
mBufferSize = newSize;
|
||||
}
|
||||
else if (mBufferSize < newSize)
|
||||
{
|
||||
//Just use the expected size
|
||||
mBuffer = (char *)dRealloc(mBuffer, newSize * sizeof(char));
|
||||
mBufferSize = newSize;
|
||||
}
|
||||
}
|
||||
|
||||
char *ReturnBuffer::getBuffer(U32 size, U32 alignment)
|
||||
{
|
||||
ensureSize(size);
|
||||
|
||||
//Align the start if necessary
|
||||
if (mStart % alignment != 0)
|
||||
{
|
||||
mStart += alignment - (mStart % alignment);
|
||||
}
|
||||
|
||||
if (size + mStart > mBufferSize)
|
||||
{
|
||||
//Restart
|
||||
mStart = 0;
|
||||
}
|
||||
char *buffer = mBuffer + mStart;
|
||||
mStart += size;
|
||||
|
||||
return buffer;
|
||||
}
|
||||
49
Engine/source/console/returnBuffer.h
Normal file
49
Engine/source/console/returnBuffer.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Copyright (c) 2012 GarageGames, LLC
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to
|
||||
// deal in the Software without restriction, including without limitation the
|
||||
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
// sell copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
// IN THE SOFTWARE.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _RETURNBUFFER_H_
|
||||
#define _RETURNBUFFER_H_
|
||||
|
||||
#ifndef _PLATFORM_H_
|
||||
#include <platform/platform.h>
|
||||
#endif
|
||||
|
||||
/// Simple circular buffer class for temporary return storage.
|
||||
class ReturnBuffer
|
||||
{
|
||||
char *mBuffer;
|
||||
U32 mBufferSize;
|
||||
U32 mStart;
|
||||
|
||||
/// Possibly expand the buffer to be larger than newSize
|
||||
void ensureSize(U32 newSize);
|
||||
|
||||
public:
|
||||
ReturnBuffer();
|
||||
~ReturnBuffer();
|
||||
|
||||
/// Get a temporary buffer with a given size (and alignment)
|
||||
/// @note The buffer will be re-used so do not consider it permanent
|
||||
char *getBuffer(U32 size, U32 alignment = 16);
|
||||
};
|
||||
|
||||
#endif //_RETURNBUFFER_H_
|
||||
Loading…
Reference in a new issue