SpirvShader: Use an atomic instead of a volatile int for serialCounter
Using 'volatile' does not make anything thread safe.
Shuts up a bunch of TSAN errors.
Bug: b/133127573
Change-Id: I90b708ac53824de91c316f61f137ecca34087047
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31830
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index cb70299..3fa6ab3 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -367,7 +367,7 @@
} // namespace SIMD
- volatile int SpirvShader::serialCounter = 1; // Start at 1, 0 is invalid shader.
+ std::atomic<int> SpirvShader::serialCounter(1); // Start at 1, 0 is invalid shader.
SpirvShader::SpirvShader(
VkPipelineShaderStageCreateInfo const *createInfo,
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 3f5997d..c8b9f93 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -29,16 +29,17 @@
#include <spirv/unified1/spirv.hpp>
#include <array>
+#include <atomic>
+#include <cstdint>
#include <cstring>
#include <functional>
-#include <string>
-#include <vector>
-#include <unordered_set>
-#include <unordered_map>
-#include <cstdint>
-#include <type_traits>
#include <memory>
#include <queue>
+#include <string>
+#include <type_traits>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
namespace vk
{
@@ -730,7 +731,7 @@
private:
const int serialID;
- static volatile int serialCounter;
+ static std::atomic<int> serialCounter;
Modes modes;
HandleMap<Type> types;
HandleMap<Object> defs;