0028217: Error handling is not thread safe and causing memory corruption and sporadic...
[occt.git] / src / Standard / Standard_Failure.cxx
index 07ecbcc..2e9c8a9 100644 (file)
@@ -58,12 +58,22 @@ static void deallocate_message(Standard_CString aMessage)
   }
 }
 
+// Define Standard_THREADLOCAL modifier as C++11 thread_local keyword
+// where it is available.
+#if (defined(__INTEL_COMPILER) && __INTEL_COMPILER > 1400) || \
+    (defined(__clang__)) /* assume standard CLang > 3.3 or XCode >= 8 */ || \
+    (defined(_MSC_VER) && _MSC_VER >= 1800) /* MSVC++ >= 14 */ || \
+    (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) /* GCC >= 4.8 */
+  #define Standard_THREADLOCAL thread_local
+#else
+  #define Standard_THREADLOCAL
+#endif
 
 // ******************************************************************
 //                           Standard_Failure                       *
 // ******************************************************************
 #ifndef NO_CXX_EXCEPTION
-static Handle(Standard_Failure) RaisedError;
+static Standard_THREADLOCAL Handle(Standard_Failure) RaisedError;
 #endif
 // ------------------------------------------------------------------
 //