CMakePM: Fix concurrent access crash

Change-Id: I9ea11619860d4066cb06dfd4a60def8208f21add
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Cristian Adam
2023-09-28 15:48:11 +02:00
parent 32001b7e2a
commit 7235e977ff
2 changed files with 18 additions and 7 deletions

View File

@@ -86,10 +86,12 @@ class IntrospectionData
{ {
public: public:
bool m_didAttemptToRun = false; bool m_didAttemptToRun = false;
bool m_didRun = true; bool m_haveCapabilitites = true;
bool m_haveKeywords = false;
QList<CMakeTool::Generator> m_generators; QList<CMakeTool::Generator> m_generators;
CMakeKeywords m_keywords; CMakeKeywords m_keywords;
QMutex m_keywordsMutex;
QVector<FileApi> m_fileApis; QVector<FileApi> m_fileApis;
CMakeTool::Version m_version; CMakeTool::Version m_version;
}; };
@@ -161,7 +163,7 @@ bool CMakeTool::isValid(bool ignoreCache) const
if (!m_introspection->m_didAttemptToRun) if (!m_introspection->m_didAttemptToRun)
readInformation(ignoreCache); readInformation(ignoreCache);
return m_introspection->m_didRun && !m_introspection->m_fileApis.isEmpty(); return m_introspection->m_haveCapabilitites && !m_introspection->m_fileApis.isEmpty();
} }
void CMakeTool::runCMake(Process &cmake, const QStringList &args, int timeoutS) const void CMakeTool::runCMake(Process &cmake, const QStringList &args, int timeoutS) const
@@ -249,7 +251,11 @@ CMakeKeywords CMakeTool::keywords()
if (!isValid()) if (!isValid())
return {}; return {};
if (m_introspection->m_keywords.functions.isEmpty() && m_introspection->m_didRun) { if (!m_introspection->m_haveKeywords && m_introspection->m_haveCapabilitites) {
QMutexLocker locker(&m_introspection->m_keywordsMutex);
if (m_introspection->m_haveKeywords)
return m_introspection->m_keywords;
Process proc; Process proc;
const FilePath findCMakeRoot = TemporaryDirectory::masterDirectoryFilePath() const FilePath findCMakeRoot = TemporaryDirectory::masterDirectoryFilePath()
@@ -311,6 +317,8 @@ CMakeKeywords CMakeTool::keywords()
const QStringList moduleFunctions = parseSyntaxHighlightingXml(); const QStringList moduleFunctions = parseSyntaxHighlightingXml();
for (const auto &function : moduleFunctions) for (const auto &function : moduleFunctions)
m_introspection->m_keywords.functions[function] = FilePath(); m_introspection->m_keywords.functions[function] = FilePath();
m_introspection->m_haveKeywords = true;
} }
return m_introspection->m_keywords; return m_introspection->m_keywords;
@@ -433,7 +441,7 @@ void CMakeTool::openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl)
void CMakeTool::readInformation(bool ignoreCache) const void CMakeTool::readInformation(bool ignoreCache) const
{ {
QTC_ASSERT(m_introspection, return ); QTC_ASSERT(m_introspection, return );
if (!m_introspection->m_didRun && m_introspection->m_didAttemptToRun) if (!m_introspection->m_haveCapabilitites && m_introspection->m_didAttemptToRun)
return; return;
m_introspection->m_didAttemptToRun = true; m_introspection->m_didAttemptToRun = true;
@@ -623,7 +631,7 @@ void CMakeTool::fetchFromCapabilities(bool ignoreCache) const
keyFromString("CMake_" + cmakeExecutable().toUserOutput())); keyFromString("CMake_" + cmakeExecutable().toUserOutput()));
if (cache && !ignoreCache) { if (cache && !ignoreCache) {
m_introspection->m_didRun = true; m_introspection->m_haveCapabilitites = true;
parseFromCapabilities(cache->value("CleanedStdOut").toString()); parseFromCapabilities(cache->value("CleanedStdOut").toString());
return; return;
} }
@@ -632,11 +640,11 @@ void CMakeTool::fetchFromCapabilities(bool ignoreCache) const
runCMake(cmake, {"-E", "capabilities"}); runCMake(cmake, {"-E", "capabilities"});
if (cmake.result() == ProcessResult::FinishedWithSuccess) { if (cmake.result() == ProcessResult::FinishedWithSuccess) {
m_introspection->m_didRun = true; m_introspection->m_haveCapabilitites = true;
parseFromCapabilities(cmake.cleanedStdOut()); parseFromCapabilities(cmake.cleanedStdOut());
} else { } else {
qCCritical(cmakeToolLog) << "Fetching capabilities failed: " << cmake.allOutput() << cmake.error(); qCCritical(cmakeToolLog) << "Fetching capabilities failed: " << cmake.allOutput() << cmake.error();
m_introspection->m_didRun = false; m_introspection->m_haveCapabilitites = false;
} }
Store newData{{"CleanedStdOut", cmake.cleanedStdOut()}}; Store newData{{"CleanedStdOut", cmake.cleanedStdOut()}};

View File

@@ -338,6 +338,9 @@ void CMakeToolManager::updateDocumentation()
QString CMakeToolManager::toolTipForRstHelpFile(const FilePath &helpFile) QString CMakeToolManager::toolTipForRstHelpFile(const FilePath &helpFile)
{ {
static QHash<FilePath, QString> map; static QHash<FilePath, QString> map;
static QMutex mutex;
QMutexLocker locker(&mutex);
if (map.contains(helpFile)) if (map.contains(helpFile))
return map.value(helpFile); return map.value(helpFile);