Ver código fonte

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)
Jeff Hutchinson 3 anos atrás
pai
commit
3988e7baee

+ 7 - 8
Engine/source/console/console.cpp

@@ -46,29 +46,28 @@
 extern StringStack STR;
 extern ConsoleValueStack<4096> gCallStack;
 
-Vector<ConsoleValue::ConversionBuffer> 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<char*>(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

+ 1 - 11
Engine/source/console/console.h

@@ -146,17 +146,7 @@ class ConsoleValue
 
    S32 type;
 
-   enum Constants
-   {
-      ConversionBufferStride = 32
-   };
-
-   struct ConversionBuffer
-   {
-      char buffer[ConversionBufferStride];
-   };
-   
-   static Vector<ConversionBuffer> sConversionBuffer;
+   static DataChunker sConversionAllocator;
 
    char* convertToBuffer() const;
 

+ 0 - 10
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<class T> inline void Vector<T>::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<class T> inline
-void Vector<T>::resetAndTreatAsScratchBuffer()
-{
-   mElementCount = 0;
-}
-
 template<class T> inline void Vector<T>::compact()
 {
    resize(mElementCount);