Make round-robin task enqueue index thread safe
Addresses TSAN error in Chromium viz_unittests and cc_unittests.
Bug: b/139010488
Change-Id: I1a53487c4787170c38898cca47bf76145ebdf6bd
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/35608
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Yarn/Scheduler.cpp b/src/Yarn/Scheduler.cpp
index 25b432e..827aa90 100644
--- a/src/Yarn/Scheduler.cpp
+++ b/src/Yarn/Scheduler.cpp
@@ -99,6 +99,7 @@
}
Scheduler::Scheduler()
+ : nextEnqueueIndex(0)
{
for (size_t i = 0; i < spinningWorkers.size(); i++)
{
diff --git a/src/Yarn/Scheduler.hpp b/src/Yarn/Scheduler.hpp
index 9649e02..992dade 100644
--- a/src/Yarn/Scheduler.hpp
+++ b/src/Yarn/Scheduler.hpp
@@ -294,7 +294,7 @@
// TODO: Make this lot thread-safe so setWorkerThreadCount() can be called
// during execution of tasks.
- unsigned int nextEnqueueIndex = 0;
+ std::atomic<unsigned int> nextEnqueueIndex;
unsigned int numWorkerThreads = 0;
std::array<Worker*, MaxWorkerThreads> workerThreads;