forked from qt-creator/qt-creator
RunControl: Fix 'Stop'
Terminate/kill current runners, so that the GUI will reflect that quite soon and not if all runners finished. Change-Id: I83eed6ecf1678444a8b38bab6cc05d8694a4eb49 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
@@ -53,7 +53,6 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl(
|
|||||||
ProjectExplorer::RunConfiguration *runConfiguration)
|
ProjectExplorer::RunConfiguration *runConfiguration)
|
||||||
: AnalyzerRunControl(startParams, runConfiguration)
|
: AnalyzerRunControl(startParams, runConfiguration)
|
||||||
, m_initialFilesToProcessSize(0)
|
, m_initialFilesToProcessSize(0)
|
||||||
, m_runningProcesses(0)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,17 +134,25 @@ bool ClangStaticAnalyzerRunControl::startEngine()
|
|||||||
m_progress.reportStarted();
|
m_progress.reportStarted();
|
||||||
|
|
||||||
// Start process(es)
|
// Start process(es)
|
||||||
|
m_runners.clear();
|
||||||
const int parallelRuns = ClangStaticAnalyzerSettings::instance()->simultaneousProcesses();
|
const int parallelRuns = ClangStaticAnalyzerSettings::instance()->simultaneousProcesses();
|
||||||
QTC_ASSERT(parallelRuns >= 1, emit finished(); return false);
|
QTC_ASSERT(parallelRuns >= 1, emit finished(); return false);
|
||||||
m_runningProcesses = 0;
|
while (m_runners.size() < parallelRuns && !m_filesToProcess.isEmpty())
|
||||||
while (m_runningProcesses < parallelRuns && !m_filesToProcess.isEmpty())
|
|
||||||
analyzeNextFile();
|
analyzeNextFile();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClangStaticAnalyzerRunControl::stopEngine()
|
void ClangStaticAnalyzerRunControl::stopEngine()
|
||||||
{
|
{
|
||||||
|
QSetIterator<ClangStaticAnalyzerRunner *> i(m_runners);
|
||||||
|
while (i.hasNext()) {
|
||||||
|
ClangStaticAnalyzerRunner *runner = i.next();
|
||||||
|
QObject::disconnect(runner, 0, this, 0);
|
||||||
|
delete runner;
|
||||||
|
}
|
||||||
|
m_runners.clear();
|
||||||
m_filesToProcess.clear();
|
m_filesToProcess.clear();
|
||||||
|
analyzeNextFile(); // emits finished
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClangStaticAnalyzerRunControl::analyzeNextFile()
|
void ClangStaticAnalyzerRunControl::analyzeNextFile()
|
||||||
@@ -154,8 +161,7 @@ void ClangStaticAnalyzerRunControl::analyzeNextFile()
|
|||||||
return; // The previous call already reported that we are finished.
|
return; // The previous call already reported that we are finished.
|
||||||
|
|
||||||
if (m_filesToProcess.isEmpty()) {
|
if (m_filesToProcess.isEmpty()) {
|
||||||
QTC_ASSERT(m_runningProcesses >= 0, return);
|
if (m_runners.size() == 0) {
|
||||||
if (m_runningProcesses == 0) {
|
|
||||||
m_progress.reportFinished();
|
m_progress.reportFinished();
|
||||||
emit finished();
|
emit finished();
|
||||||
}
|
}
|
||||||
@@ -167,9 +173,9 @@ void ClangStaticAnalyzerRunControl::analyzeNextFile()
|
|||||||
const QStringList options = config.createClangOptions();
|
const QStringList options = config.createClangOptions();
|
||||||
|
|
||||||
ClangStaticAnalyzerRunner *runner = createRunner();
|
ClangStaticAnalyzerRunner *runner = createRunner();
|
||||||
|
m_runners.insert(runner);
|
||||||
qCDebug(LOG) << "analyzeNextFile:" << filePath;
|
qCDebug(LOG) << "analyzeNextFile:" << filePath;
|
||||||
QTC_ASSERT(runner->run(filePath, options), return);
|
QTC_ASSERT(runner->run(filePath, options), return);
|
||||||
++m_runningProcesses;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClangStaticAnalyzerRunner *ClangStaticAnalyzerRunControl::createRunner()
|
ClangStaticAnalyzerRunner *ClangStaticAnalyzerRunControl::createRunner()
|
||||||
@@ -208,7 +214,7 @@ void ClangStaticAnalyzerRunControl::onRunnerFinishedWithFailure(const QString &e
|
|||||||
|
|
||||||
void ClangStaticAnalyzerRunControl::handleFinished()
|
void ClangStaticAnalyzerRunControl::handleFinished()
|
||||||
{
|
{
|
||||||
--m_runningProcesses;
|
m_runners.remove(qobject_cast<ClangStaticAnalyzerRunner *>(sender()));
|
||||||
updateProgressValue();
|
updateProgressValue();
|
||||||
sender()->deleteLater();
|
sender()->deleteLater();
|
||||||
analyzeNextFile();
|
analyzeNextFile();
|
||||||
|
@@ -74,8 +74,8 @@ private:
|
|||||||
QString m_clangLogFileDir;
|
QString m_clangLogFileDir;
|
||||||
QFutureInterface<void> m_progress;
|
QFutureInterface<void> m_progress;
|
||||||
QList<SourceFileConfiguration> m_filesToProcess;
|
QList<SourceFileConfiguration> m_filesToProcess;
|
||||||
|
QSet<ClangStaticAnalyzerRunner *> m_runners;
|
||||||
int m_initialFilesToProcessSize;
|
int m_initialFilesToProcessSize;
|
||||||
int m_runningProcesses;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
@@ -84,8 +84,13 @@ ClangStaticAnalyzerRunner::ClangStaticAnalyzerRunner(const QString &clangExecuta
|
|||||||
ClangStaticAnalyzerRunner::~ClangStaticAnalyzerRunner()
|
ClangStaticAnalyzerRunner::~ClangStaticAnalyzerRunner()
|
||||||
{
|
{
|
||||||
const QProcess::ProcessState processState = m_process.state();
|
const QProcess::ProcessState processState = m_process.state();
|
||||||
if (processState == QProcess::Starting || processState == QProcess::Running)
|
if (processState == QProcess::Starting || processState == QProcess::Running) {
|
||||||
|
m_process.terminate();
|
||||||
|
if (!m_process.waitForFinished(500)) {
|
||||||
m_process.kill();
|
m_process.kill();
|
||||||
|
m_process.waitForFinished();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClangStaticAnalyzerRunner::run(const QString &filePath, const QStringList &compilerOptions)
|
bool ClangStaticAnalyzerRunner::run(const QString &filePath, const QStringList &compilerOptions)
|
||||||
|
Reference in New Issue
Block a user