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

View File

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