From d582cc332836b42b9d3b0cde2a0a04eb36220bb1 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 16 Nov 2018 09:08:07 +0100 Subject: [PATCH] ProjectExplorer/MSVC: Fix thread-unsafe call The runner created in AbstractMsvcToolChain::createMacroInspectionRunner() called indirectly back into the not thread-safe ToolChain::language(). This call is not needed as we already have the language at hand. Change-Id: I2d55bdfa19f1c05447b6dd12afde5b5fa006d9e2 Reviewed-by: Tobias Hunger Reviewed-by: David Schulz --- .../projectexplorer/abstractmsvctoolchain.cpp | 2 +- src/plugins/projectexplorer/abstractmsvctoolchain.h | 3 ++- src/plugins/projectexplorer/msvctoolchain.cpp | 13 +++++++------ src/plugins/projectexplorer/msvctoolchain.h | 6 ++++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp index fb3ad79b7af..33861c36815 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp @@ -129,7 +129,7 @@ ToolChain::MacroInspectionRunner AbstractMsvcToolChain::createMacroInspectionRun const Macros macros = msvcPredefinedMacros(filteredFlags, env); - const auto report = MacroInspectionReport{macros, languageVersion(macros)}; + const auto report = MacroInspectionReport{macros, msvcLanguageVersion(lang, macros)}; macroCache->insert(filteredFlags, report); return report; diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.h b/src/plugins/projectexplorer/abstractmsvctoolchain.h index ccafa4f2995..8fc7c46be50 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.h +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.h @@ -98,7 +98,8 @@ protected: // Function must be thread-safe! virtual Macros msvcPredefinedMacros(const QStringList cxxflags, const Utils::Environment& env) const = 0; - virtual LanguageVersion languageVersion(const Macros ¯os) const = 0; + virtual LanguageVersion msvcLanguageVersion(const Core::Id &language, + const Macros ¯os) const = 0; Utils::FileName m_debuggerCommand; diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index fb87cfb2032..7638884aad6 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -525,9 +525,9 @@ Macros MsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags, // // For _MSV_VER values, see https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017. // -LanguageVersion MsvcToolChain::languageVersion(const Macros ¯os) const +LanguageVersion MsvcToolChain::msvcLanguageVersion(const Core::Id &language, + const Macros ¯os) const { - const Core::Id lang = language(); int mscVer = -1; QByteArray msvcLang; for (const ProjectExplorer::Macro ¯o : macros) { @@ -538,7 +538,7 @@ LanguageVersion MsvcToolChain::languageVersion(const Macros ¯os) const } QTC_CHECK(mscVer > 0); - if (lang == Constants::CXX_LANGUAGE_ID) { + if (language == Constants::CXX_LANGUAGE_ID) { if (!msvcLang.isEmpty()) // >= Visual Studio 2015 Update 3 return ToolChain::cxxLanguageVersion(msvcLang); if (mscVer >= 1800) // >= Visual Studio 2013 (12.0) @@ -546,7 +546,7 @@ LanguageVersion MsvcToolChain::languageVersion(const Macros ¯os) const if (mscVer >= 1600) // >= Visual Studio 2010 (10.0) return LanguageVersion::CXX11; return LanguageVersion::CXX98; - } else if (lang == Constants::C_LANGUAGE_ID) { + } else if (language == Constants::C_LANGUAGE_ID) { if (mscVer >= 1910) // >= Visual Studio 2017 RTW (15.0) return LanguageVersion::C11; return LanguageVersion::C99; @@ -1134,9 +1134,10 @@ Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags, return Macro::toMacros(response.allRawOutput()); } -LanguageVersion ClangClToolChain::languageVersion(const Macros ¯os) const +LanguageVersion ClangClToolChain::msvcLanguageVersion(const Core::Id &language, + const Macros ¯os) const { - return ToolChain::languageVersion(language(), macros); + return ToolChain::languageVersion(language, macros); } // -------------------------------------------------------------------------- diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h index 46b7489d23c..c1482b95b3a 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -94,7 +94,8 @@ protected: // Function must be thread-safe! Macros msvcPredefinedMacros(const QStringList cxxflags, const Utils::Environment &env) const override; - LanguageVersion languageVersion(const Macros ¯os) const override; + LanguageVersion msvcLanguageVersion(const Core::Id &language, + const Macros ¯os) const override; private: struct GenerateEnvResult @@ -139,7 +140,8 @@ public: void resetMsvcToolChain(const MsvcToolChain *base = nullptr); Macros msvcPredefinedMacros(const QStringList cxxflags, const Utils::Environment &env) const override; - LanguageVersion languageVersion(const Macros ¯os) const override; + LanguageVersion msvcLanguageVersion(const Core::Id &language, + const Macros ¯os) const override; bool operator ==(const ToolChain &) const override; private: