From 3988e7baee36e5811c3c6cdee0bdc48a02106e97 Mon Sep 17 00:00:00 2001 From: Jeff Hutchinson Date: Sat, 21 May 2022 21:55:44 -0400 Subject: [PATCH] Better allocator for TorqueScript temp conversions used during interpretation instead of using a Vector<> that never frees and grows for torquescript temporaries created when doing type conversions) --- Engine/source/console/console.cpp | 15 +++++++-------- Engine/source/console/console.h | 12 +----------- Engine/source/core/util/tVector.h | 10 ---------- 3 files changed, 8 insertions(+), 29 deletions(-) diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index d9ba1dcff..1c96a15fb 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -46,29 +46,28 @@ extern StringStack STR; extern ConsoleValueStack<4096> gCallStack; -Vector ConsoleValue::sConversionBuffer; +DataChunker ConsoleValue::sConversionAllocator; void ConsoleValue::init() { - sConversionBuffer.reserve(8192); + sConversionAllocator.setChunkSize(8092); } void ConsoleValue::resetConversionBuffer() { - sConversionBuffer.resetAndTreatAsScratchBuffer(); + sConversionAllocator.freeBlocks(); } char* ConsoleValue::convertToBuffer() const { - ConversionBuffer conversion; + char* buffer = static_cast(sConversionAllocator.alloc(32)); if (type == ConsoleValueType::cvFloat) - dSprintf(conversion.buffer, ConversionBufferStride, "%.9g", f); + dSprintf(buffer, 32, "%.9g", f); else - dSprintf(conversion.buffer, ConversionBufferStride, "%lld", i); + dSprintf(buffer, 32, "%lld", i); - sConversionBuffer.push_back(std::move(conversion)); - return sConversionBuffer.last().buffer; + return buffer; } const char* ConsoleValue::getConsoleData() const diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 8816e4e99..26a3ec175 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -146,17 +146,7 @@ class ConsoleValue S32 type; - enum Constants - { - ConversionBufferStride = 32 - }; - - struct ConversionBuffer - { - char buffer[ConversionBufferStride]; - }; - - static Vector sConversionBuffer; + static DataChunker sConversionAllocator; char* convertToBuffer() const; diff --git a/Engine/source/core/util/tVector.h b/Engine/source/core/util/tVector.h index 57cb84e24..0700a5554 100644 --- a/Engine/source/core/util/tVector.h +++ b/Engine/source/core/util/tVector.h @@ -160,7 +160,6 @@ class Vector void erase(U32 index, U32 count); void erase_fast(iterator); void clear(); - void resetAndTreatAsScratchBuffer(); void compact(); void sort(compare_func f); void fill( const T& value ); @@ -530,15 +529,6 @@ template inline void Vector::clear() mElementCount = 0; } -/// This method sets the vector as its 0 and will overwrite memory on subsequent usage. -/// Note that the current memory in use is never freed or deallocated, so only use this if the vector -/// is being used as a scratch buffer only. -template inline -void Vector::resetAndTreatAsScratchBuffer() -{ - mElementCount = 0; -} - template inline void Vector::compact() { resize(mElementCount);