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
This commit is contained in:
Klaus Basan
2015-06-04 18:34:14 +02:00
parent d603b28697
commit dbce887946
5 changed files with 52 additions and 41 deletions

View File

@@ -49,9 +49,9 @@ namespace BlackMisc
bool ok; bool ok;
auto aircraftCfgEntriesList = parseImpl(rootDirectory, excludedDirectories, &ok); auto aircraftCfgEntriesList = parseImpl(rootDirectory, excludedDirectories, &ok);
if (!ok) { return; } if (!ok) { return; }
bool c = QMetaObject::invokeMethod(this, "ps_updateCfgEntriesList", bool c = QMetaObject::invokeMethod(this, "updateCfgEntriesList",
Q_ARG(BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList, aircraftCfgEntriesList)); 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); 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; m_parsedCfgEntriesList = cfgEntriesList;
emit parsingFinished(true); emit parsingFinished(true);

View File

@@ -66,12 +66,15 @@ namespace BlackMisc
//! Get parsed aircraft cfg entries list //! Get parsed aircraft cfg entries list
CAircraftCfgEntriesList getAircraftCfgEntriesList() const { return m_parsedCfgEntriesList; } CAircraftCfgEntriesList getAircraftCfgEntriesList() const { return m_parsedCfgEntriesList; }
public slots:
//! Parsed or injected entires
void updateCfgEntriesList(const BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList &cfgEntriesList);
signals: signals:
//! Parsing is finished //! Parsing is finished
void parsingFinished(bool success); void parsingFinished(bool success);
private slots: private slots:
void ps_updateCfgEntriesList(const BlackMisc::Simulation::FsCommon::CAircraftCfgEntriesList &cfgEntriesList);
CAircraftCfgEntriesList parseImpl(const QString &directory, const QStringList &excludeDirectories, bool *ok); CAircraftCfgEntriesList parseImpl(const QString &directory, const QStringList &excludeDirectories, bool *ok);
private: private:

View File

@@ -11,6 +11,7 @@
#include "blackmisc/logmessage.h" #include "blackmisc/logmessage.h"
#include "blackmisc/worker.h" #include "blackmisc/worker.h"
#include <utility> #include <utility>
#include <atomic>
using namespace BlackMisc; using namespace BlackMisc;
using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation;
@@ -31,12 +32,13 @@ namespace BlackMisc
CAircraftMatcher::~CAircraftMatcher() CAircraftMatcher::~CAircraftMatcher()
{ {
gracefulShutdown(); cancelInit();
if (this->m_initWorker) { this->m_initWorker->waitForFinished(); }
} }
void CAircraftMatcher::init() void CAircraftMatcher::init()
{ {
if (m_initWorker) { return; } if (m_initState != NotInitialized) { return; }
m_initWorker = BlackMisc::CWorker::fromTask(this, "CAircraftMatcher::initImpl", [this]() m_initWorker = BlackMisc::CWorker::fromTask(this, "CAircraftMatcher::initImpl", [this]()
{ {
initImpl(); initImpl();
@@ -45,7 +47,7 @@ namespace BlackMisc
bool CAircraftMatcher::isInitialized() const bool CAircraftMatcher::isInitialized() const
{ {
return m_initialized; return m_initState == InitFinished;
} }
void CAircraftMatcher::setModelMappingProvider(std::unique_ptr<IModelMappingsProvider> mappings) void CAircraftMatcher::setModelMappingProvider(std::unique_ptr<IModelMappingsProvider> mappings)
@@ -122,16 +124,10 @@ namespace BlackMisc
return synchronizeWithExistingModels(m_installedModels.getSortedModelStrings()); return synchronizeWithExistingModels(m_installedModels.getSortedModelStrings());
} }
void CAircraftMatcher::gracefulShutdown() void CAircraftMatcher::cancelInit()
{ {
// when running, force re-init // when running, force re-init
this->m_initInProgress = false; this->m_initState = NotInitialized;
this->m_initialized = false;
}
void CAircraftMatcher::markUninitialized()
{
this->m_initialized = false;
} }
const CAircraftModel &CAircraftMatcher::getDefaultModel() const CAircraftModel &CAircraftMatcher::getDefaultModel()
@@ -144,11 +140,16 @@ namespace BlackMisc
m_defaultModel = defaultModel; m_defaultModel = defaultModel;
} }
void CAircraftMatcher::ps_setModelMappingRules(const CAircraftMappingList &mappings)
{
m_modelMappings = mappings;
}
void CAircraftMatcher::initImpl() void CAircraftMatcher::initImpl()
{ {
if (m_initialized) { return; } InitState e = NotInitialized;
if (m_initInProgress) { return; } InitState d = InitInProgress;
m_initInProgress = true; if (!m_initState.compare_exchange_weak(e, d)) { return; }
// sync // sync
this->synchronize(); this->synchronize();
@@ -156,9 +157,8 @@ namespace BlackMisc
// finish // finish
CLogMessage(this).info("Mapping system: %1 definitions for %2 installed models") << m_modelMappings.size() CLogMessage(this).info("Mapping system: %1 definitions for %2 installed models") << m_modelMappings.size()
<< m_installedModels.size(); << m_installedModels.size();
m_initInProgress = false; m_initState = InitFinished;
m_initialized = true;
emit initializationFinished(); emit initializationFinished();
} }
@@ -231,6 +231,7 @@ namespace BlackMisc
CAircraftMappingList newList; CAircraftMappingList newList;
for (const CAircraftMapping &mapping : m_modelMappings) for (const CAircraftMapping &mapping : m_modelMappings)
{ {
if (this->m_initState != InitInProgress) { return 0; } // canceled
QString modelString = mapping.getModel().getModelString(); QString modelString = mapping.getModel().getModelString();
if (modelString.isEmpty()) { continue; } if (modelString.isEmpty()) { continue; }
if (modelNames.contains(modelString, cs)) if (modelNames.contains(modelString, cs))

View File

@@ -68,9 +68,15 @@ namespace BlackMisc
//! Init completed? //! Init completed?
bool isInitialized() const; bool isInitialized() const;
//! Get all models
const CAircraftModelList &getInstalledModelsList() const { return m_installedModels; }
//! Set the list of installed models //! Set the list of installed models
void setInstalledModels(const CAircraftModelList &models) { m_installedModels = 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 //! Set the model mapping provider. The CAircraftMatcher will move the object and take over ownership
void setModelMappingProvider(std::unique_ptr<IModelMappingsProvider> mappings); void setModelMappingProvider(std::unique_ptr<IModelMappingsProvider> mappings);
@@ -96,10 +102,7 @@ namespace BlackMisc
int synchronize(); int synchronize();
//! Shutdown //! Shutdown
void gracefulShutdown(); void cancelInit();
//! To force reload
void markUninitialized();
//! default model //! default model
const BlackMisc::Simulation::CAircraftModel &getDefaultModel(); const BlackMisc::Simulation::CAircraftModel &getDefaultModel();
@@ -108,13 +111,17 @@ namespace BlackMisc
void setDefaultModel(const BlackMisc::Simulation::CAircraftModel &defaultModel); void setDefaultModel(const BlackMisc::Simulation::CAircraftModel &defaultModel);
private slots: private slots:
//! Set the mapping rules
void ps_setModelMappingRules(const BlackMisc::Network::CAircraftMappingList &mappings) void ps_setModelMappingRules(const BlackMisc::Network::CAircraftMappingList &mappings);
{
m_modelMappings = mappings;
}
private: private:
//! Init state
enum InitState
{
NotInitialized,
InitInProgress,
InitFinished
};
void initImpl(); void initImpl();
void initMappings(); void initMappings();
@@ -130,9 +137,8 @@ namespace BlackMisc
void reverseLookupIcaoData(BlackMisc::Simulation::CAircraftModel &model); void reverseLookupIcaoData(BlackMisc::Simulation::CAircraftModel &model);
std::unique_ptr<BlackMisc::Simulation::IModelMappingsProvider> m_mappingsProvider; //!< Provides all mapping definitions std::unique_ptr<BlackMisc::Simulation::IModelMappingsProvider> m_mappingsProvider; //!< Provides all mapping definitions
std::atomic<bool> m_initialized = { false }; std::atomic<InitState> m_initState = NotInitialized;
std::atomic<bool> m_initInProgress = { false }; QPointer<BlackMisc::CWorker> m_initWorker;
BlackMisc::CWorker *m_initWorker = { nullptr };
MatchingMode m_matchingMode = ModelMatching; MatchingMode m_matchingMode = ModelMatching;
CAircraftModelList m_installedModels; CAircraftModelList m_installedModels;
BlackMisc::Network::CAircraftMappingList m_modelMappings; BlackMisc::Network::CAircraftMappingList m_modelMappings;

View File

@@ -43,20 +43,20 @@ namespace BlackSimPlugin
auto modelMappingsProvider = std::unique_ptr<IModelMappingsProvider> { BlackMisc::make_unique<CModelMappingsProviderVPilot>(true) }; auto modelMappingsProvider = std::unique_ptr<IModelMappingsProvider> { BlackMisc::make_unique<CModelMappingsProviderVPilot>(true) };
m_modelMatcher.setModelMappingProvider(std::move(modelMappingsProvider)); m_modelMatcher.setModelMappingProvider(std::move(modelMappingsProvider));
connect(&m_aircraftCfgParser, &CAircraftCfgParser::parsingFinished, this, &CSimulatorFsCommon::ps_aircraftCfgParsingFinished);
CVariant aircraftCfg = getPluginData(this, "aircraft_cfg"); CVariant aircraftCfg = getPluginData(this, "aircraft_cfg");
if (aircraftCfg.isValid()) if (aircraftCfg.isValid())
{ {
m_modelMatcher.setInstalledModels(aircraftCfg.value<CAircraftCfgEntriesList>().toAircraftModelList()); // will behave like parsing was finished
m_modelMatcher.init(); m_aircraftCfgParser.updateCfgEntriesList(aircraftCfg.value<CAircraftCfgEntriesList>());
} }
//
// reading from settings would go here
//
else else
{ {
connect(&m_aircraftCfgParser, &CAircraftCfgParser::parsingFinished, this, &CSimulatorFsCommon::ps_aircraftCfgParsingFinished); m_aircraftCfgParser.parse(CAircraftCfgParser::ModeAsync);
m_aircraftCfgParser.parse();
} }
//
// reading from cache / settings would go here
//
} }
CSimulatorFsCommon::~CSimulatorFsCommon() { } CSimulatorFsCommon::~CSimulatorFsCommon() { }
@@ -135,7 +135,7 @@ namespace BlackSimPlugin
CAircraftModelList CSimulatorFsCommon::getInstalledModels() const CAircraftModelList CSimulatorFsCommon::getInstalledModels() const
{ {
return m_aircraftCfgParser.getAircraftCfgEntriesList().toAircraftModelList(); return m_modelMatcher.getInstalledModelsList();
} }
CAircraftIcaoData CSimulatorFsCommon::getIcaoForModelString(const QString &modelString) const CAircraftIcaoData CSimulatorFsCommon::getIcaoForModelString(const QString &modelString) const
@@ -215,6 +215,7 @@ namespace BlackSimPlugin
void CSimulatorFsCommon::unload() void CSimulatorFsCommon::unload()
{ {
this->m_aircraftCfgParser.cancelParsing(); this->m_aircraftCfgParser.cancelParsing();
this->m_modelMatcher.cancelInit();
CSimulatorCommon::unload(); CSimulatorCommon::unload();
} }