From 4ceaab166cd1af6b582faa4cf51036e00a0d88e3 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Sun, 12 Nov 2017 15:43:03 -0700 Subject: [PATCH] Memory: Move to a normal model of ownership of memory pools, for new/delete. Addresses step 4 of #976, overlaps #916. For each pool, now, it is newed, remembered, and freed by the same entity, rather than having a mix (thread finalize freeing current pool) that could lead to double freeing of the same pool. It is quite rational and simple now. This will enable reinstalling process and thread tear down. --- glslang/MachineIndependent/PoolAlloc.cpp | 11 ++++++++--- glslang/MachineIndependent/ShaderLang.cpp | 9 ++++----- 2 files changed, 12 insertions(+), 8 deletions(-) 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) {