diff --git a/src/blackgui/views/aircraftmodelvalidationdialog.cpp b/src/blackgui/views/aircraftmodelvalidationdialog.cpp index fb21eca64..3a9835cdd 100644 --- a/src/blackgui/views/aircraftmodelvalidationdialog.cpp +++ b/src/blackgui/views/aircraftmodelvalidationdialog.cpp @@ -13,6 +13,7 @@ #include #include #include +#include using namespace BlackMisc; using namespace BlackMisc::Simulation; @@ -63,7 +64,7 @@ namespace BlackGui CAircraftModelList invalid; const bool ignoreEmpty = false; const int maxFailedFiles = 25; - bool wasStopped = false; + std::atomic_bool wasStopped { false }; const CStatusMessageList msgs = CAircraftModelUtilities::validateModelFiles(m_simulator, m_models, valid, invalid, ignoreEmpty, maxFailedFiles, wasStopped, m_simulatorDir); ui->comp_StatusMessage->clear(); ui->comp_StatusMessage->setNoSorting(); // we use the pre-sorted list diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 166a8cdfb..4b4e359ea 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -1527,7 +1527,7 @@ namespace BlackMisc return msgs; } - CStatusMessageList CAircraftModelList::validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simRootDirectory, bool alreadySortedByFn) const + CStatusMessageList CAircraftModelList::validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simRootDirectory, bool alreadySortedByFn) const { wasStopped = false; @@ -1575,7 +1575,7 @@ namespace BlackMisc if (workingFiles.contains(fn) || model.hasExistingCorrespondingFile()) { - if (!simRootDirectory.isEmpty() && !fn.contains(simRootDir)) + if (!simRootDirectory.isEmpty() && !fn.contains(simRootDir)) { // check if in root directory msgs.push_back(CStatusMessage(this).validationError(u"'%1', not in root directory '%2', '%3' skipped") << model.getModelStringAndDbKey() << simRootDir << model.getFileName()); @@ -1663,17 +1663,17 @@ namespace BlackMisc // convert { CJsonScope scope("aircraftIcaos"); - Q_UNUSED(scope); + Q_UNUSED(scope) helper.getTable().convertFromJson(aircraftIcaos.toObject()); } { CJsonScope scope("liveries"); - Q_UNUSED(scope); + Q_UNUSED(scope) helper.getTable().convertFromJson(liveries.toObject()); } { CJsonScope scope("distributors"); - Q_UNUSED(scope); + Q_UNUSED(scope) helper.getTable().convertFromJson(distributors.toObject()); } @@ -1681,7 +1681,7 @@ namespace BlackMisc for (auto i = array.begin(); i != array.end(); ++i) { CJsonScope scope("containerbase", index++); - Q_UNUSED(scope); + Q_UNUSED(scope) CAircraftModel value; value.convertFromMemoizedJson(i->toObject(), helper); this->push_back(value); diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index 185975b59..1a0fa15de 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -36,6 +36,7 @@ #include #include #include +#include namespace BlackMisc { @@ -509,7 +510,7 @@ namespace BlackMisc CStatusMessageList validateDistributors(const CDistributorList &distributors, CAircraftModelList &validModels, CAircraftModelList &invalidModels) const; //! Validate files (file exists etc.) - CStatusMessageList validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simRootDirectory, bool alreadySortedByFn = false) const; + CStatusMessageList validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simRootDirectory, bool alreadySortedByFn = false) const; //! To compact JSON format QJsonObject toMemoizedJson() const; diff --git a/src/blackmisc/simulation/aircraftmodelutils.cpp b/src/blackmisc/simulation/aircraftmodelutils.cpp index 001da818e..324233fc3 100644 --- a/src/blackmisc/simulation/aircraftmodelutils.cpp +++ b/src/blackmisc/simulation/aircraftmodelutils.cpp @@ -140,7 +140,7 @@ namespace BlackMisc return ok ? dir.absoluteFilePath(fn) : ""; } - CStatusMessageList CAircraftModelUtilities::validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir) + CStatusMessageList CAircraftModelUtilities::validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir) { // some generic tests CStatusMessageList msgs; diff --git a/src/blackmisc/simulation/aircraftmodelutils.h b/src/blackmisc/simulation/aircraftmodelutils.h index bf1fafb5d..69fa00799 100644 --- a/src/blackmisc/simulation/aircraftmodelutils.h +++ b/src/blackmisc/simulation/aircraftmodelutils.h @@ -11,6 +11,7 @@ #ifndef BLACKMISC_SIMULATION_AIRCRAFTMODELUTILS_H #define BLACKMISC_SIMULATION_AIRCRAFTMODELUTILS_H +#include #include "blackmisc/blackmiscexport.h" #include "blackmisc/simulation/aircraftmodellist.h" @@ -36,7 +37,7 @@ namespace BlackMisc static QString createIcaoAirlineAircraftHtmlMatrixFile(const BlackMisc::Simulation::CAircraftModelList &models, const QString &tempDir); //! Validate aircraft.cfg entries - static CStatusMessageList validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir); + static CStatusMessageList validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir); }; } //namespace } // namespace diff --git a/src/blackmisc/simulation/backgroundvalidation.cpp b/src/blackmisc/simulation/backgroundvalidation.cpp index da47e7e2f..822b62f71 100644 --- a/src/blackmisc/simulation/backgroundvalidation.cpp +++ b/src/blackmisc/simulation/backgroundvalidation.cpp @@ -104,9 +104,10 @@ namespace BlackMisc return true; } - unsigned long CBackgroundValidation::waitTimeoutMs() const + void CBackgroundValidation::beforeQuit() noexcept { - return 0; + m_wasStopped = true; // stop in utility functions + m_updateTimer.stop(); } void CBackgroundValidation::doWork() @@ -119,11 +120,11 @@ namespace BlackMisc CAircraftModelList valid; CAircraftModelList invalid; CStatusMessageList msgs; - bool wasStopped = false; bool validated = false; bool onlyErrorsAndWarnings = false; const CSimulatorInfo simulator = this->getCurrentSimulator(); const qint64 started = QDateTime::currentMSecsSinceEpoch(); + m_wasStopped = false; do { @@ -144,7 +145,7 @@ namespace BlackMisc } else { - msgs = CAircraftModelUtilities::validateModelFiles(simulator, models, valid, invalid, false, 25, wasStopped, m_simDirectory); + msgs = CAircraftModelUtilities::validateModelFiles(simulator, models, valid, invalid, false, 25, m_wasStopped, m_simDirectory); } const qint64 deltaTimeMs = now - started; @@ -155,7 +156,7 @@ namespace BlackMisc QWriteLocker l(&m_lock); m_lastResultValid = valid; m_lastResultInvalid = invalid; - m_lastResultWasStopped = wasStopped; + m_lastResultWasStopped = m_wasStopped; m_lastResultSimulator = simulator; m_lastResultMsgs = msgs; m_checkedSimulatorMsgs.insert(simulator, msgs); @@ -178,7 +179,7 @@ namespace BlackMisc if (validated) { const bool e = !onlyErrorsAndWarnings || (!invalid.isEmpty() || msgs.hasWarningOrErrorMessages()); - if (e || !isTimerBased) { emit this->validated(simulator, valid, invalid, wasStopped, msgs); } + if (e || !isTimerBased) { emit this->validated(simulator, valid, invalid, m_wasStopped, msgs); } } } } // ns diff --git a/src/blackmisc/simulation/backgroundvalidation.h b/src/blackmisc/simulation/backgroundvalidation.h index e62410838..60b832c91 100644 --- a/src/blackmisc/simulation/backgroundvalidation.h +++ b/src/blackmisc/simulation/backgroundvalidation.h @@ -76,14 +76,15 @@ namespace BlackMisc void validated(const CSimulatorInfo &simulator, const CAircraftModelList &validModels, const CAircraftModelList &invalidModels, bool stopped, const CStatusMessageList &msgs); protected: - //! \copydoc CContinuousWorker::waitTimeoutMs - virtual unsigned long waitTimeoutMs() const override; + //! \copydoc CContinuousWorker::beforeQuit + virtual void beforeQuit() noexcept override; private: - mutable QReadWriteLock m_lock; //!< lock snapshot - std::atomic_bool m_inWork { false }; //!< indicates a running update - CSimulatorInfo m_simulator; //!< simulator - QString m_simDirectory; //!< corresponding sim directory + mutable QReadWriteLock m_lock; //!< lock snapshot + std::atomic_bool m_inWork { false }; //!< indicates a running update + std::atomic_bool m_wasStopped { false }; //!< has been stopped or should be stopped + CSimulatorInfo m_simulator; //!< simulator + QString m_simDirectory; //!< corresponding sim directory // last result values, mostly needed when running in the distributed swift system and we want to get the values CAircraftModelList m_lastResultValid; diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.cpp b/src/blackmisc/simulation/fscommon/fscommonutil.cpp index 5ab57dabe..6c9ccc2bb 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.cpp +++ b/src/blackmisc/simulation/fscommon/fscommonutil.cpp @@ -639,7 +639,7 @@ namespace BlackMisc return paths; } - CStatusMessageList CFsCommonUtil::validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped) + CStatusMessageList CFsCommonUtil::validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped) { CStatusMessage m; CAircraftModelList sorted(models); @@ -703,14 +703,14 @@ namespace BlackMisc return msgs; } - CStatusMessageList CFsCommonUtil::validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir) + CStatusMessageList CFsCommonUtil::validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir) { const QString simObjectsDir = simulatorDir.isEmpty() ? CFsCommonUtil::p3dSimObjectsDir() : CFsCommonUtil::p3dSimObjectsDirFromSimDir(simulatorDir); const QStringList simObjectPaths = CFsCommonUtil::p3dSimObjectsDirPlusAddOnXmlSimObjectsPaths(simObjectsDir, "v4"); return CFsCommonUtil::validateSimObjectsPath(QSet(simObjectPaths.begin(), simObjectPaths.end()), models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, wasStopped); } - CStatusMessageList CFsCommonUtil::validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir) + CStatusMessageList CFsCommonUtil::validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &stopped, const QString &simulatorDir) { Q_UNUSED(simulatorDir) const QStringList simObjectPaths = CFsCommonUtil::fsxSimObjectsDirPlusAddOnXmlSimObjectsPaths(); @@ -726,7 +726,7 @@ namespace BlackMisc CStatusMessageList CFsCommonUtil::validateSimObjectsPath( const QSet &simObjectDirs, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, - bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped) + bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &stopped) { CStatusMessageList msgs; if (simObjectDirs.isEmpty()) diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.h b/src/blackmisc/simulation/fscommon/fscommonutil.h index 5f30ee6e9..89466d685 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.h +++ b/src/blackmisc/simulation/fscommon/fscommonutil.h @@ -15,6 +15,7 @@ #include "blackmisc/logcategorylist.h" #include "blackmisc/blackmiscexport.h" +#include #include #include @@ -139,15 +140,15 @@ namespace BlackMisc //! Validate aircraft.cfg entries (sometimes also sim.cfg) //! \remark only for FSX/P3D/FS9 models - static CStatusMessageList validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped); + static CStatusMessageList validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped); //! Validate if known SimObjects path are used //! \remark only for P3D - static CStatusMessageList validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir); + static CStatusMessageList validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir); //! Validate if known SimObjects path are used //! \remark only for FSX - static CStatusMessageList validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir); + static CStatusMessageList validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir); //! .air file filter static const QString airFileFilter(); @@ -159,7 +160,7 @@ namespace BlackMisc //! Validate if known SimObjects path are used //! \remark only for P3D/FSX - static CStatusMessageList validateSimObjectsPath(const QSet &simObjectDirs, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped); + static CStatusMessageList validateSimObjectsPath(const QSet &simObjectDirs, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &stopped); //! Log the reading of config files static bool logConfigPathReading();