diff --git a/gui/threadhandler.cpp b/gui/threadhandler.cpp index fecfb44b23b..7363e167939 100644 --- a/gui/threadhandler.cpp +++ b/gui/threadhandler.cpp @@ -38,9 +38,7 @@ ThreadHandler::ThreadHandler(QObject *parent) : QObject(parent) -{ - setThreadCount(1); -} +{} ThreadHandler::~ThreadHandler() { @@ -54,7 +52,7 @@ void ThreadHandler::clearFiles() mAnalyseWholeProgram = false; mCtuInfo.clear(); mAddonsAndTools.clear(); - mSuppressions.clear(); + mSuppressionsUI.clear(); } void ThreadHandler::setFiles(const QStringList &files) @@ -83,6 +81,14 @@ void ThreadHandler::setCheckFiles(const QStringList& files) } } +void ThreadHandler::setupCheckThread(CheckThread &thread) const +{ + thread.setAddonsAndTools(mCheckAddonsAndTools); + thread.setSuppressions(mSuppressionsUI); + thread.setClangIncludePaths(mClangIncludePaths); + thread.setSettings(mCheckSettings, mCheckSuppressions); +} + void ThreadHandler::check(const Settings &settings, const std::shared_ptr& supprs) { if (mResults.getFileCount() == 0 || mRunningThreadCount > 0 || settings.jobs == 0) { @@ -91,25 +97,25 @@ void ThreadHandler::check(const Settings &settings, const std::shared_ptrsetAddonsAndTools(addonsAndTools); - mThreads[i]->setSuppressions(mSuppressions); - mThreads[i]->setClangIncludePaths(mClangIncludePaths); - mThreads[i]->setSettings(settings, supprs); + setupCheckThread(*mThreads[i]); mThreads[i]->start(); } @@ -123,14 +129,12 @@ void ThreadHandler::check(const Settings &settings, const std::shared_ptr 0; + return mRunningThreadCount > 0 || mAnalyseWholeProgram; } -void ThreadHandler::setThreadCount(const int count) +void ThreadHandler::createThreads(const int count) { - if (mRunningThreadCount > 0 || - count == mThreads.size() || - count <= 0) { + if (mRunningThreadCount > 0 || count <= 0) { return; } @@ -140,9 +144,9 @@ void ThreadHandler::setThreadCount(const int count) for (int i = mThreads.size(); i < count; i++) { mThreads << new CheckThread(mResults); connect(mThreads.last(), &CheckThread::done, - this, &ThreadHandler::threadDone); + this, &ThreadHandler::threadDone, Qt::QueuedConnection); connect(mThreads.last(), &CheckThread::fileChecked, - &mResults, &ThreadResult::fileChecked); + &mResults, &ThreadResult::fileChecked, Qt::QueuedConnection); } } @@ -151,7 +155,7 @@ void ThreadHandler::removeThreads() { for (CheckThread* thread : mThreads) { if (thread->isRunning()) { - thread->terminate(); + thread->stop(); thread->wait(); } disconnect(thread, &CheckThread::done, @@ -162,19 +166,22 @@ void ThreadHandler::removeThreads() } mThreads.clear(); - mAnalyseWholeProgram = false; } void ThreadHandler::threadDone() { - if (mRunningThreadCount == 1 && mAnalyseWholeProgram) { + mRunningThreadCount--; + + if (mRunningThreadCount == 0 && mAnalyseWholeProgram) { + createThreads(1); + mRunningThreadCount = 1; + setupCheckThread(*mThreads[0]); mThreads[0]->analyseWholeProgram(mLastFiles, mCtuInfo); mAnalyseWholeProgram = false; mCtuInfo.clear(); return; } - mRunningThreadCount--; if (mRunningThreadCount == 0) { emit done(); @@ -185,6 +192,9 @@ void ThreadHandler::threadDone() mLastCheckTime = mCheckStartTime; mCheckStartTime = QDateTime(); } + + mCheckAddonsAndTools.clear(); + mCheckSuppressions.reset(); } } @@ -215,7 +225,7 @@ void ThreadHandler::initialize(const ResultsView *view) void ThreadHandler::loadSettings(const QSettings &settings) { - setThreadCount(settings.value(SETTINGS_CHECK_THREADS, 1).toInt()); + createThreads(settings.value(SETTINGS_CHECK_THREADS, 1).toInt()); } void ThreadHandler::saveSettings(QSettings &settings) const diff --git a/gui/threadhandler.h b/gui/threadhandler.h index 49a326933b0..5a687e74762 100644 --- a/gui/threadhandler.h +++ b/gui/threadhandler.h @@ -20,6 +20,7 @@ #ifndef THREADHANDLER_H #define THREADHANDLER_H +#include "settings.h" #include "suppressions.h" #include "threadresult.h" @@ -37,7 +38,6 @@ class ResultsView; class CheckThread; class QSettings; -class Settings; class ImportProject; class ErrorItem; @@ -55,12 +55,6 @@ class ThreadHandler : public QObject { explicit ThreadHandler(QObject *parent = nullptr); ~ThreadHandler() override; - /** - * @brief Set the number of threads to use - * @param count The number of threads to use - */ - void setThreadCount(int count); - /** * @brief Initialize the threads (connect all signals to resultsview's slots) * @@ -85,7 +79,7 @@ class ThreadHandler : public QObject { } void setSuppressions(const QList &s) { - mSuppressions = s; + mSuppressionsUI = s; } void setClangIncludePaths(const QStringList &s) { @@ -235,12 +229,24 @@ protected slots: */ int mScanDuration{}; + /** + * @brief Create checker threads + * @param count The number of threads to spawn + */ + void createThreads(int count); + /** * @brief Function to delete all threads * */ void removeThreads(); + /* + * @brief Apply check settings to a checker thread + * @param thread The thread to setup + */ + void setupCheckThread(CheckThread &thread) const; + /** * @brief Thread results are stored here * @@ -259,12 +265,24 @@ protected slots: */ int mRunningThreadCount{}; + /** + * @brief A whole program check is queued by check() + */ bool mAnalyseWholeProgram{}; std::string mCtuInfo; QStringList mAddonsAndTools; - QList mSuppressions; + QList mSuppressionsUI; QStringList mClangIncludePaths; + + /// @{ + /** + * @brief Settings specific to the current analysis + */ + QStringList mCheckAddonsAndTools; + Settings mCheckSettings; + std::shared_ptr mCheckSuppressions; + /// @} private: /**