diff --git a/Engine/source/console/compiledEval.cpp b/Engine/source/console/compiledEval.cpp index 73969afb2..47f5717ad 100644 --- a/Engine/source/console/compiledEval.cpp +++ b/Engine/source/console/compiledEval.cpp @@ -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; } diff --git a/Engine/source/console/returnBuffer.cpp b/Engine/source/console/returnBuffer.cpp new file mode 100644 index 000000000..6813339ea --- /dev/null +++ b/Engine/source/console/returnBuffer.cpp @@ -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; +} diff --git a/Engine/source/console/returnBuffer.h b/Engine/source/console/returnBuffer.h new file mode 100644 index 000000000..9fa374cb5 --- /dev/null +++ b/Engine/source/console/returnBuffer.h @@ -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 +#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_