forked from qt-creator/qt-creator
CMakePM: Fix concurrent access crash
Change-Id: I9ea11619860d4066cb06dfd4a60def8208f21add Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -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()}};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user