GLES: Fix race in Renderer destruction
The clipper and blitter were being destructed before the worker threads were stopped.
Also nullify after deleting other fields - this would have been much harder to detect if the clipper and blitter were not already being nullified after destruction.
Tested with:
./unittests --gtest_repeat=100 --gtest_filter=SwiftShaderTest.TransformFeedback_DrawArraysInstanced
Bug: b/124288179
Change-Id: Iefea829dfb8556c877c0a086253c5924c54aa638
Reviewed-on: https://swiftshader-review.googlesource.com/c/24748
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp
index d481f27..f713bd7 100644
--- a/src/Device/Renderer.cpp
+++ b/src/Device/Renderer.cpp
@@ -175,7 +175,10 @@
Renderer::~Renderer()
{
+ sync->lock(EXCLUSIVE);
sync->destruct();
+ terminateThreads();
+ sync->unlock();
delete clipper;
clipper = nullptr;
@@ -183,15 +186,17 @@
delete blitter;
blitter = nullptr;
- terminateThreads();
delete resumeApp;
+ resumeApp = nullptr;
for(int draw = 0; draw < DRAW_COUNT; draw++)
{
delete drawCall[draw];
+ drawCall[draw] = nullptr;
}
delete swiftConfig;
+ swiftConfig = nullptr;
}
// This object has to be mem aligned
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp
index 27c2194..87b8dd1 100644
--- a/src/Renderer/Renderer.cpp
+++ b/src/Renderer/Renderer.cpp
@@ -209,7 +209,10 @@
Renderer::~Renderer()
{
+ sync->lock(EXCLUSIVE);
sync->destruct();
+ terminateThreads();
+ sync->unlock();
delete clipper;
clipper = nullptr;
@@ -217,15 +220,17 @@
delete blitter;
blitter = nullptr;
- terminateThreads();
delete resumeApp;
+ resumeApp = nullptr;
for(int draw = 0; draw < DRAW_COUNT; draw++)
{
delete drawCall[draw];
+ drawCall[draw] = nullptr;
}
delete swiftConfig;
+ swiftConfig = nullptr;
}
// This object has to be mem aligned