From dbce88794660ffd6f002678d6a0f7458132ace08 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 4 Jun 2015 18:34:14 +0200 Subject: [PATCH] refs #438, allow to stop and reinit parser/matcher * plugin changes, mapper/parser will be stopped. make sure worker is properly shutdown * restarted FS/FSX. Allow to reset mapper/parser data from store --- .../simulation/fscommon/aircraftcfgparser.cpp | 6 ++-- .../simulation/fscommon/aircraftcfgparser.h | 5 ++- .../simulation/fscommon/aircraftmatcher.cpp | 35 ++++++++++--------- .../simulation/fscommon/aircraftmatcher.h | 30 +++++++++------- .../simulator/fscommon/simulator_fscommon.cpp | 17 ++++----- 5 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp index c432176e4..2544cde99 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp @@ -49,9 +49,9 @@ namespace BlackMisc bool ok; auto aircraftCfgEntriesList = parseImpl(rootDirectory, excludedDirectories, &ok); if (!ok) { return; } - bool c = QMetaObject::invokeMethod(this, "ps_updateCfgEntriesList", + bool c = QMetaObject::invokeMethod(this, "updateCfgEntriesList", Q_ARG(BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList, aircraftCfgEntriesList)); - Q_ASSERT_X(c, Q_FUNC_INFO, "Cannot invoke ps_updateCfgEntriesList"); + Q_ASSERT_X(c, Q_FUNC_INFO, "Cannot invoke updateCfgEntriesList"); Q_UNUSED(c); }); } @@ -63,7 +63,7 @@ namespace BlackMisc } } - void CAircraftCfgParser::ps_updateCfgEntriesList(const CAircraftCfgEntriesList &cfgEntriesList) + void CAircraftCfgParser::updateCfgEntriesList(const CAircraftCfgEntriesList &cfgEntriesList) { m_parsedCfgEntriesList = cfgEntriesList; emit parsingFinished(true); diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgparser.h b/src/blackmisc/simulation/fscommon/aircraftcfgparser.h index 1f5d5f743..5ed077b2e 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.h +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.h @@ -66,12 +66,15 @@ namespace BlackMisc //! Get parsed aircraft cfg entries list CAircraftCfgEntriesList getAircraftCfgEntriesList() const { return m_parsedCfgEntriesList; } + public slots: + //! Parsed or injected entires + void updateCfgEntriesList(const BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList &cfgEntriesList); + signals: //! Parsing is finished void parsingFinished(bool success); private slots: - void ps_updateCfgEntriesList(const BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList &cfgEntriesList); CAircraftCfgEntriesList parseImpl(const QString &directory, const QStringList &excludeDirectories, bool *ok); private: diff --git a/src/blackmisc/simulation/fscommon/aircraftmatcher.cpp b/src/blackmisc/simulation/fscommon/aircraftmatcher.cpp index 3cd4418bf..94f8bc0de 100644 --- a/src/blackmisc/simulation/fscommon/aircraftmatcher.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftmatcher.cpp @@ -11,6 +11,7 @@ #include "blackmisc/logmessage.h" #include "blackmisc/worker.h" #include +#include using namespace BlackMisc; using namespace BlackMisc::Simulation; @@ -31,12 +32,13 @@ namespace BlackMisc CAircraftMatcher::~CAircraftMatcher() { - gracefulShutdown(); + cancelInit(); + if (this->m_initWorker) { this->m_initWorker->waitForFinished(); } } void CAircraftMatcher::init() { - if (m_initWorker) { return; } + if (m_initState != NotInitialized) { return; } m_initWorker = BlackMisc::CWorker::fromTask(this, "CAircraftMatcher::initImpl", [this]() { initImpl(); @@ -45,7 +47,7 @@ namespace BlackMisc bool CAircraftMatcher::isInitialized() const { - return m_initialized; + return m_initState == InitFinished; } void CAircraftMatcher::setModelMappingProvider(std::unique_ptr mappings) @@ -122,16 +124,10 @@ namespace BlackMisc return synchronizeWithExistingModels(m_installedModels.getSortedModelStrings()); } - void CAircraftMatcher::gracefulShutdown() + void CAircraftMatcher::cancelInit() { // when running, force re-init - this->m_initInProgress = false; - this->m_initialized = false; - } - - void CAircraftMatcher::markUninitialized() - { - this->m_initialized = false; + this->m_initState = NotInitialized; } const CAircraftModel &CAircraftMatcher::getDefaultModel() @@ -144,11 +140,16 @@ namespace BlackMisc m_defaultModel = defaultModel; } + void CAircraftMatcher::ps_setModelMappingRules(const CAircraftMappingList &mappings) + { + m_modelMappings = mappings; + } + void CAircraftMatcher::initImpl() { - if (m_initialized) { return; } - if (m_initInProgress) { return; } - m_initInProgress = true; + InitState e = NotInitialized; + InitState d = InitInProgress; + if (!m_initState.compare_exchange_weak(e, d)) { return; } // sync this->synchronize(); @@ -156,9 +157,8 @@ namespace BlackMisc // finish CLogMessage(this).info("Mapping system: %1 definitions for %2 installed models") << m_modelMappings.size() - << m_installedModels.size(); - m_initInProgress = false; - m_initialized = true; + << m_installedModels.size(); + m_initState = InitFinished; emit initializationFinished(); } @@ -231,6 +231,7 @@ namespace BlackMisc CAircraftMappingList newList; for (const CAircraftMapping &mapping : m_modelMappings) { + if (this->m_initState != InitInProgress) { return 0; } // canceled QString modelString = mapping.getModel().getModelString(); if (modelString.isEmpty()) { continue; } if (modelNames.contains(modelString, cs)) diff --git a/src/blackmisc/simulation/fscommon/aircraftmatcher.h b/src/blackmisc/simulation/fscommon/aircraftmatcher.h index 8810f999b..9da81601d 100644 --- a/src/blackmisc/simulation/fscommon/aircraftmatcher.h +++ b/src/blackmisc/simulation/fscommon/aircraftmatcher.h @@ -68,9 +68,15 @@ namespace BlackMisc //! Init completed? bool isInitialized() const; + //! Get all models + const CAircraftModelList &getInstalledModelsList() const { return m_installedModels; } + //! Set the list of installed models void setInstalledModels(const CAircraftModelList &models) { m_installedModels = models; } + //! Number of models + int countInstalledModels() const { return m_installedModels.size(); } + //! Set the model mapping provider. The CAircraftMatcher will move the object and take over ownership void setModelMappingProvider(std::unique_ptr mappings); @@ -96,10 +102,7 @@ namespace BlackMisc int synchronize(); //! Shutdown - void gracefulShutdown(); - - //! To force reload - void markUninitialized(); + void cancelInit(); //! default model const BlackMisc::Simulation::CAircraftModel &getDefaultModel(); @@ -108,13 +111,17 @@ namespace BlackMisc void setDefaultModel(const BlackMisc::Simulation::CAircraftModel &defaultModel); private slots: - - void ps_setModelMappingRules(const BlackMisc::Network::CAircraftMappingList &mappings) - { - m_modelMappings = mappings; - } + //! Set the mapping rules + void ps_setModelMappingRules(const BlackMisc::Network::CAircraftMappingList &mappings); private: + //! Init state + enum InitState + { + NotInitialized, + InitInProgress, + InitFinished + }; void initImpl(); void initMappings(); @@ -130,9 +137,8 @@ namespace BlackMisc void reverseLookupIcaoData(BlackMisc::Simulation::CAircraftModel &model); std::unique_ptr m_mappingsProvider; //!< Provides all mapping definitions - std::atomic m_initialized = { false }; - std::atomic m_initInProgress = { false }; - BlackMisc::CWorker *m_initWorker = { nullptr }; + std::atomic m_initState = NotInitialized; + QPointer m_initWorker; MatchingMode m_matchingMode = ModelMatching; CAircraftModelList m_installedModels; BlackMisc::Network::CAircraftMappingList m_modelMappings; diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.cpp b/src/plugins/simulator/fscommon/simulator_fscommon.cpp index c869ff6de..55e0e2638 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.cpp +++ b/src/plugins/simulator/fscommon/simulator_fscommon.cpp @@ -43,20 +43,20 @@ namespace BlackSimPlugin auto modelMappingsProvider = std::unique_ptr { BlackMisc::make_unique(true) }; m_modelMatcher.setModelMappingProvider(std::move(modelMappingsProvider)); + connect(&m_aircraftCfgParser, &CAircraftCfgParser::parsingFinished, this, &CSimulatorFsCommon::ps_aircraftCfgParsingFinished); CVariant aircraftCfg = getPluginData(this, "aircraft_cfg"); if (aircraftCfg.isValid()) { - m_modelMatcher.setInstalledModels(aircraftCfg.value().toAircraftModelList()); - m_modelMatcher.init(); + // will behave like parsing was finished + m_aircraftCfgParser.updateCfgEntriesList(aircraftCfg.value()); } - // - // reading from settings would go here - // else { - connect(&m_aircraftCfgParser, &CAircraftCfgParser::parsingFinished, this, &CSimulatorFsCommon::ps_aircraftCfgParsingFinished); - m_aircraftCfgParser.parse(); + m_aircraftCfgParser.parse(CAircraftCfgParser::ModeAsync); } + // + // reading from cache / settings would go here + // } CSimulatorFsCommon::~CSimulatorFsCommon() { } @@ -135,7 +135,7 @@ namespace BlackSimPlugin CAircraftModelList CSimulatorFsCommon::getInstalledModels() const { - return m_aircraftCfgParser.getAircraftCfgEntriesList().toAircraftModelList(); + return m_modelMatcher.getInstalledModelsList(); } CAircraftIcaoData CSimulatorFsCommon::getIcaoForModelString(const QString &modelString) const @@ -215,6 +215,7 @@ namespace BlackSimPlugin void CSimulatorFsCommon::unload() { this->m_aircraftCfgParser.cancelParsing(); + this->m_modelMatcher.cancelInit(); CSimulatorCommon::unload(); }