forked from qt-creator/qt-creator
CMake: Do not crash when restarting a filesystem scan
Change-Id: I7a86169f4dd891c91295a7d6daadfd2bac8db751 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -142,11 +142,12 @@ void BuildDirManager::updateReaderData()
|
|||||||
|
|
||||||
void BuildDirManager::parseOnceReaderReady(bool force)
|
void BuildDirManager::parseOnceReaderReady(bool force)
|
||||||
{
|
{
|
||||||
m_futureInterface.reset(new QFutureInterface<QList<ProjectExplorer::FileNode *>>());
|
auto fi = new QFutureInterface<QList<ProjectExplorer::FileNode *>>();
|
||||||
m_futureWatcher.setFuture(m_futureInterface->future());
|
m_scanFuture = fi->future();
|
||||||
|
m_futureWatcher.setFuture(m_scanFuture);
|
||||||
|
|
||||||
Core::ProgressManager::addTask(m_futureInterface->future(), "Scan CMake project tree", "CMake.Scan.Tree");
|
Core::ProgressManager::addTask(fi->future(), "Scan CMake project tree", "CMake.Scan.Tree");
|
||||||
Utils::runAsync([this]() { BuildDirManager::asyncScanForFiles(*m_futureInterface); });
|
Utils::runAsync([this, fi]() { BuildDirManager::asyncScanForFiles(fi); });
|
||||||
|
|
||||||
checkConfiguration();
|
checkConfiguration();
|
||||||
m_reader->stop();
|
m_reader->stop();
|
||||||
@@ -237,9 +238,10 @@ void BuildDirManager::becameDirty()
|
|||||||
m_reparseTimer.start(1000);
|
m_reparseTimer.start(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuildDirManager::asyncScanForFiles(QFutureInterface<QList<FileNode *> > &fi)
|
void BuildDirManager::asyncScanForFiles(QFutureInterface<QList<FileNode *>> *fi)
|
||||||
{
|
{
|
||||||
fi.reportStarted();
|
std::unique_ptr<QFutureInterface<QList<FileNode *>>> fip(fi);
|
||||||
|
fip->reportStarted();
|
||||||
Utils::MimeDatabase mdb;
|
Utils::MimeDatabase mdb;
|
||||||
|
|
||||||
QList<FileNode *> nodes
|
QList<FileNode *> nodes
|
||||||
@@ -274,10 +276,10 @@ void BuildDirManager::asyncScanForFiles(QFutureInterface<QList<FileNode *> > &fi
|
|||||||
}
|
}
|
||||||
return new FileNode(fn, type, false);
|
return new FileNode(fn, type, false);
|
||||||
},
|
},
|
||||||
&fi);
|
fip.get());
|
||||||
fi.setProgressValue(m_futureInterface->progressMaximum());
|
fip->setProgressValue(fip->progressMaximum());
|
||||||
fi.reportResult(nodes);
|
fip->reportResult(nodes);
|
||||||
fi.reportFinished();
|
fip->reportFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuildDirManager::forceReparse()
|
void BuildDirManager::forceReparse()
|
||||||
@@ -298,9 +300,7 @@ void BuildDirManager::resetData()
|
|||||||
m_reader->resetData();
|
m_reader->resetData();
|
||||||
|
|
||||||
m_cmakeCache.clear();
|
m_cmakeCache.clear();
|
||||||
QTC_ASSERT(!m_futureInterface || m_futureInterface->isFinished(), return);
|
m_futureWatcher.setFuture(QFuture<QList<FileNode *>>());
|
||||||
m_futureInterface.reset();
|
|
||||||
|
|
||||||
m_reader.reset();
|
m_reader.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,16 +327,16 @@ bool BuildDirManager::persistCMakeState()
|
|||||||
void BuildDirManager::generateProjectTree(CMakeListsNode *root)
|
void BuildDirManager::generateProjectTree(CMakeListsNode *root)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_reader, return);
|
QTC_ASSERT(m_reader, return);
|
||||||
QTC_ASSERT(m_futureInterface, return);
|
QTC_ASSERT(m_scanFuture.isFinished(), return);
|
||||||
|
|
||||||
const Utils::FileName projectFile = m_buildConfiguration->target()->project()->projectFilePath();
|
const Utils::FileName projectFile = m_buildConfiguration->target()->project()->projectFilePath();
|
||||||
QList<FileNode *> tmp = Utils::filtered(m_futureInterface->future().result(),
|
QList<FileNode *> tmp = Utils::filtered(m_scanFuture.result(),
|
||||||
[projectFile](const FileNode *fn) -> bool {
|
[projectFile](const FileNode *fn) -> bool {
|
||||||
return !fn->filePath().toString().startsWith(projectFile.toString() + ".user");
|
return !fn->filePath().toString().startsWith(projectFile.toString() + ".user");
|
||||||
});
|
});
|
||||||
Utils::sort(tmp, ProjectExplorer::Node::sortByPath);
|
Utils::sort(tmp, ProjectExplorer::Node::sortByPath);
|
||||||
|
|
||||||
m_futureInterface.reset(); // Make sure to flush the stale results
|
m_scanFuture = QFuture<QList<FileNode *>>(); // flush stale results
|
||||||
|
|
||||||
const QList<FileNode *> allFiles = tmp;
|
const QList<FileNode *> allFiles = tmp;
|
||||||
m_reader->generateProjectTree(root, allFiles);
|
m_reader->generateProjectTree(root, allFiles);
|
||||||
|
@@ -103,7 +103,7 @@ private:
|
|||||||
|
|
||||||
void becameDirty();
|
void becameDirty();
|
||||||
|
|
||||||
void asyncScanForFiles(QFutureInterface<QList<ProjectExplorer::FileNode*>> &fi);
|
void asyncScanForFiles(QFutureInterface<QList<ProjectExplorer::FileNode *>> *fi);
|
||||||
|
|
||||||
CMakeBuildConfiguration *m_buildConfiguration = nullptr;
|
CMakeBuildConfiguration *m_buildConfiguration = nullptr;
|
||||||
mutable std::unique_ptr<QTemporaryDir> m_tempDir = nullptr;
|
mutable std::unique_ptr<QTemporaryDir> m_tempDir = nullptr;
|
||||||
@@ -112,8 +112,8 @@ private:
|
|||||||
QTimer m_reparseTimer;
|
QTimer m_reparseTimer;
|
||||||
|
|
||||||
std::unique_ptr<BuildDirReader> m_reader;
|
std::unique_ptr<BuildDirReader> m_reader;
|
||||||
std::unique_ptr<QFutureInterface<QList<ProjectExplorer::FileNode*>>> m_futureInterface;
|
|
||||||
QFutureWatcher<QList<ProjectExplorer::FileNode*>> m_futureWatcher;
|
QFutureWatcher<QList<ProjectExplorer::FileNode*>> m_futureWatcher;
|
||||||
|
QFuture<QList<ProjectExplorer::FileNode*>> m_scanFuture;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
Reference in New Issue
Block a user