QmakeProjectManager: Do not leak QmakeEvalResults

Fixes: QTCREATORBUG-26326
Change-Id: I2a4abf86e9dd607bf7a0bf0843b0c9bff943d704
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
Christian Kandeler
2021-10-21 12:15:57 +02:00
parent d7c7089ff3
commit c3cee40411
2 changed files with 17 additions and 17 deletions

View File

@@ -1194,7 +1194,7 @@ QmakeProFile::~QmakeProFile()
void QmakeProFile::setupFutureWatcher() void QmakeProFile::setupFutureWatcher()
{ {
m_parseFutureWatcher = new QFutureWatcher<Internal::QmakeEvalResult *>; m_parseFutureWatcher = new QFutureWatcher<Internal::QmakeEvalResultPtr>;
QObject::connect(m_parseFutureWatcher, &QFutureWatcherBase::finished, [this]() { QObject::connect(m_parseFutureWatcher, &QFutureWatcherBase::finished, [this]() {
applyAsyncEvaluate(true); applyAsyncEvaluate(true);
}); });
@@ -1292,10 +1292,10 @@ void QmakeProFile::asyncUpdate()
m_readerExact->setExact(false); m_readerExact->setExact(false);
m_parseFutureWatcher->waitForFinished(); m_parseFutureWatcher->waitForFinished();
QmakeEvalInput input = evalInput(); QmakeEvalInput input = evalInput();
QFuture<QmakeEvalResult *> future = Utils::runAsync(ProjectExplorerPlugin::sharedThreadPool(), QFuture<QmakeEvalResultPtr> future = Utils::runAsync(ProjectExplorerPlugin::sharedThreadPool(),
QThread::LowestPriority, QThread::LowestPriority,
&QmakeProFile::asyncEvaluate, &QmakeProFile::asyncEvaluate,
this, input); this, input);
m_parseFutureWatcher->setFuture(future); m_parseFutureWatcher->setFuture(future);
} }
@@ -1375,9 +1375,9 @@ static bool evaluateOne(const QmakeEvalInput &input, ProFile *pro,
return true; return true;
} }
QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input) QmakeEvalResultPtr QmakeProFile::evaluate(const QmakeEvalInput &input)
{ {
auto *result = new QmakeEvalResult; QmakeEvalResultPtr result(new QmakeEvalResult);
QtSupport::ProFileReader *exactBuildPassReader = nullptr; QtSupport::ProFileReader *exactBuildPassReader = nullptr;
QtSupport::ProFileReader *cumulativeBuildPassReader = nullptr; QtSupport::ProFileReader *cumulativeBuildPassReader = nullptr;
ProFile *pro; ProFile *pro;
@@ -1635,10 +1635,9 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input)
return result; return result;
} }
void QmakeProFile::asyncEvaluate(QFutureInterface<QmakeEvalResult *> &fi, QmakeEvalInput input) void QmakeProFile::asyncEvaluate(QFutureInterface<QmakeEvalResultPtr> &fi, QmakeEvalInput input)
{ {
QmakeEvalResult *evalResult = evaluate(input); fi.reportResult(evaluate(input));
fi.reportResult(evalResult);
} }
void QmakeProFile::applyAsyncEvaluate(bool apply) void QmakeProFile::applyAsyncEvaluate(bool apply)
@@ -1653,9 +1652,8 @@ bool sortByParserNodes(Node *a, Node *b)
return a->filePath() < b->filePath(); return a->filePath() < b->filePath();
} }
void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult) void QmakeProFile::applyEvaluate(const QmakeEvalResultPtr &result)
{ {
QScopedPointer<QmakeEvalResult> result(evalResult);
if (!m_readerExact) if (!m_readerExact)
return; return;
@@ -1664,7 +1662,7 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult)
return; return;
} }
foreach (const QString &error, evalResult->errors) foreach (const QString &error, result->errors)
QmakeBuildSystem::proFileParseError(error, filePath()); QmakeBuildSystem::proFileParseError(error, filePath());
// we are changing what is executed in that case // we are changing what is executed in that case

View File

@@ -116,6 +116,7 @@ namespace Internal {
Q_DECLARE_LOGGING_CATEGORY(qmakeNodesLog) Q_DECLARE_LOGGING_CATEGORY(qmakeNodesLog)
class QmakeEvalInput; class QmakeEvalInput;
class QmakeEvalResult; class QmakeEvalResult;
using QmakeEvalResultPtr = std::shared_ptr<QmakeEvalResult>; // FIXME: Use unique_ptr once we require Qt 6
class QmakePriFileEvalResult; class QmakePriFileEvalResult;
} // namespace Internal; } // namespace Internal;
@@ -358,10 +359,11 @@ private:
void setupReader(); void setupReader();
Internal::QmakeEvalInput evalInput() const; Internal::QmakeEvalInput evalInput() const;
static Internal::QmakeEvalResult *evaluate(const Internal::QmakeEvalInput &input); static Internal::QmakeEvalResultPtr evaluate(const Internal::QmakeEvalInput &input);
void applyEvaluate(Internal::QmakeEvalResult *parseResult); void applyEvaluate(const Internal::QmakeEvalResultPtr &parseResult);
void asyncEvaluate(QFutureInterface<Internal::QmakeEvalResult *> &fi, Internal::QmakeEvalInput input); void asyncEvaluate(QFutureInterface<Internal::QmakeEvalResultPtr> &fi,
Internal::QmakeEvalInput input);
void cleanupProFileReaders(); void cleanupProFileReaders();
void updateGeneratedFiles(const Utils::FilePath &buildDir); void updateGeneratedFiles(const Utils::FilePath &buildDir);
@@ -400,7 +402,7 @@ private:
QMap<QString, QStringList> m_wildcardDirectoryContents; QMap<QString, QStringList> m_wildcardDirectoryContents;
// Async stuff // Async stuff
QFutureWatcher<Internal::QmakeEvalResult *> *m_parseFutureWatcher = nullptr; QFutureWatcher<Internal::QmakeEvalResultPtr> *m_parseFutureWatcher = nullptr;
QtSupport::ProFileReader *m_readerExact = nullptr; QtSupport::ProFileReader *m_readerExact = nullptr;
QtSupport::ProFileReader *m_readerCumulative = nullptr; QtSupport::ProFileReader *m_readerCumulative = nullptr;
}; };