diff --git a/glslang/MachineIndependent/PoolAlloc.cpp b/glslang/MachineIndependent/PoolAlloc.cpp index 5077a26b..57943b1f 100644 --- a/glslang/MachineIndependent/PoolAlloc.cpp +++ b/glslang/MachineIndependent/PoolAlloc.cpp @@ -47,6 +47,7 @@ OS_TLSIndex PoolIndex; struct TThreadMemoryPools { TPoolAllocator* threadPoolAllocator; // the current pool + TPoolAllocator* initialMemoryPool; // the original pool owned by this thread (this file), to be freed here as well }; // Return the thread-specific pool pointers. @@ -80,6 +81,8 @@ bool InitializePoolIndex() if ((PoolIndex = OS_AllocTLSIndex()) == OS_INVALID_TLS_INDEX) return false; + SetThreadMemoryPools(nullptr); + return true; } @@ -95,7 +98,8 @@ void InitializeMemoryPools() { if (GetThreadMemoryPools() == nullptr) { SetThreadMemoryPools(new TThreadMemoryPools()); - SetThreadPoolAllocator(new TPoolAllocator()); + GetThreadMemoryPools()->initialMemoryPool = new TPoolAllocator(); + SetThreadPoolAllocator(GetThreadMemoryPools()->initialMemoryPool); } } @@ -103,9 +107,10 @@ void InitializeMemoryPools() void FreeMemoryPools() { if (GetThreadMemoryPools() != nullptr) { - GetThreadPoolAllocator().popAll(); - delete &GetThreadPoolAllocator(); + if (GetThreadMemoryPools()->initialMemoryPool != nullptr) + delete GetThreadMemoryPools()->initialMemoryPool; delete GetThreadMemoryPools(); + SetThreadMemoryPools(nullptr); } } diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index 8de5297b..d1dec88b 100644 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -1602,8 +1602,9 @@ public: }; TShader::TShader(EShLanguage s) - : pool(0), stage(s), lengths(nullptr), stringNames(nullptr), preamble("") + : stage(s), lengths(nullptr), stringNames(nullptr), preamble("") { + pool = new TPoolAllocator; infoSink = new TInfoSink; compiler = new TDeferredCompiler(stage, *infoSink); intermediate = new TIntermediate(s); @@ -1707,7 +1708,6 @@ bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion if (! InitThread()) return false; - pool = new TPoolAllocator(); SetThreadPoolAllocator(pool); if (! preamble) preamble = ""; @@ -1731,7 +1731,6 @@ bool TShader::preprocess(const TBuiltInResource* builtInResources, if (! InitThread()) return false; - pool = new TPoolAllocator(); SetThreadPoolAllocator(pool); if (! preamble) preamble = ""; @@ -1752,8 +1751,9 @@ const char* TShader::getInfoDebugLog() return infoSink->debug.c_str(); } -TProgram::TProgram() : pool(0), reflection(0), ioMapper(nullptr), linked(false) +TProgram::TProgram() : reflection(0), ioMapper(nullptr), linked(false) { + pool = new TPoolAllocator; infoSink = new TInfoSink; for (int s = 0; s < EShLangCount; ++s) { intermediate[s] = 0; @@ -1788,7 +1788,6 @@ bool TProgram::link(EShMessages messages) bool error = false; - pool = new TPoolAllocator(); SetThreadPoolAllocator(pool); for (int s = 0; s < EShLangCount; ++s) {