diff --git a/src/blackcore/databasereader.cpp b/src/blackcore/databasereader.cpp index c64512454..49711cb76 100644 --- a/src/blackcore/databasereader.cpp +++ b/src/blackcore/databasereader.cpp @@ -37,7 +37,7 @@ namespace BlackCore { this->threadAssertCheck(); JsonDatastoreResponse datastoreResponse; - if (m_shutdown || this->isFinished()) + if (this->isFinishedOrShutdown()) { CLogMessage(this).info("Terminated data parsing process"); // for users nwReply->abort(); diff --git a/src/blackcore/setupreader.cpp b/src/blackcore/setupreader.cpp index c589d9eba..d61a4bbbe 100644 --- a/src/blackcore/setupreader.cpp +++ b/src/blackcore/setupreader.cpp @@ -124,7 +124,7 @@ namespace BlackCore QString replyMessage(nwReply->errorString()); this->threadAssertCheck(); - if (this->isFinished()) + if (this->isFinishedOrShutdown()) { CLogMessage(this).debug() << Q_FUNC_INFO; CLogMessage(this).info("Terminated loading bootstrap files"); diff --git a/src/blackcore/vatsimbookingreader.cpp b/src/blackcore/vatsimbookingreader.cpp index a23bcd9f0..e4e09ef78 100644 --- a/src/blackcore/vatsimbookingreader.cpp +++ b/src/blackcore/vatsimbookingreader.cpp @@ -57,7 +57,7 @@ namespace BlackCore this->threadAssertCheck(); // Worker thread, make sure to write no members here! - if (this->isFinished()) + if (this->isFinishedOrShutdown()) { CLogMessage(this).debug() << Q_FUNC_INFO; CLogMessage(this).info("terminated booking parsing process"); // for users @@ -93,7 +93,7 @@ namespace BlackCore CAtcStationList bookedStations; for (int i = 0; i < size; i++) { - if (this->isFinished()) + if (this->isFinishedOrShutdown()) { CLogMessage(this).debug() << Q_FUNC_INFO; CLogMessage(this).info("Terminated booking parsing process"); // for users diff --git a/src/blackcore/vatsimdatafilereader.cpp b/src/blackcore/vatsimdatafilereader.cpp index 038c3e27c..e24dc7399 100644 --- a/src/blackcore/vatsimdatafilereader.cpp +++ b/src/blackcore/vatsimdatafilereader.cpp @@ -173,7 +173,7 @@ namespace BlackCore this->threadAssertCheck(); // Worker thread, make sure to write only synced here! - if (this->isFinished()) + if (this->isFinishedOrShutdown()) { CLogMessage(this).debug() << Q_FUNC_INFO; CLogMessage(this).info("Terminated VATSIM file parsing process"); // for users @@ -200,9 +200,9 @@ namespace BlackCore QStringList clientSectionAttributes; Section section = SectionNone; - foreach(QString currentLine, lines) + for (const QString &cl : lines) { - if (this->isFinished()) + if (this->isFinishedOrShutdown()) { CLogMessage(this).debug() << Q_FUNC_INFO; CLogMessage(this).info("Terminated booking parsing process"); // for users @@ -210,7 +210,7 @@ namespace BlackCore } // parse lines - currentLine = currentLine.trimmed(); + QString currentLine(cl.trimmed()); if (currentLine.isEmpty()) continue; if (currentLine.startsWith(";")) { diff --git a/src/blackcore/vatsimmetarreader.cpp b/src/blackcore/vatsimmetarreader.cpp index be43e61f6..26ca9e66d 100644 --- a/src/blackcore/vatsimmetarreader.cpp +++ b/src/blackcore/vatsimmetarreader.cpp @@ -76,7 +76,7 @@ namespace BlackCore this->threadAssertCheck(); // Worker thread, make sure to write thread safe! - if (this->isFinished()) + if (this->isFinishedOrShutdown()) { CLogMessage(this).debug() << Q_FUNC_INFO; CLogMessage(this).info("terminated METAR decoding process"); // for users @@ -94,6 +94,7 @@ namespace BlackCore QTextStream lineReader(&metarData); while (!lineReader.atEnd()) { + if (this->isFinishedOrShutdown()) { return; } QString line = lineReader.readLine(); CMetar metar = m_metarDecoder.decode(line); if (metar != CMetar()) @@ -117,7 +118,8 @@ namespace BlackCore Q_UNUSED(invalidMetars); if (invalidLineCount > 0) { - CLogMessage(this).warning("Reading METARs failed for %1 entries") << invalidLineCount; + // Regular issue, log it, but do not show to user + CLogMessage(this).debug() << "Reading METARs failed for entries" << invalidLineCount; } emit metarsRead(metars); emit dataRead(CEntityFlags::MetarEntity, CEntityFlags::ReadFinished, metars.size()); diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index 6e8740b34..ad4f42009 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -374,9 +374,10 @@ namespace BlackCore this->disconnect(); // all signals if (this->m_vatsimBookingReader) { this->m_vatsimBookingReader->gracefulShutdown(); } if (this->m_vatsimDataFileReader) { this->m_vatsimDataFileReader->gracefulShutdown(); } - if (this->m_modelDataReader) { this->m_modelDataReader->gracefulShutdown(); } - if (this->m_icaoDataReader) { this->m_icaoDataReader->gracefulShutdown(); } - if (this->m_databaseWriter) { this->m_databaseWriter->gracefulShutdown(); } + if (this->m_vatsimMetarReader) { this->m_vatsimMetarReader->gracefulShutdown(); } + if (this->m_modelDataReader) { this->m_modelDataReader->gracefulShutdown(); } + if (this->m_icaoDataReader) { this->m_icaoDataReader->gracefulShutdown(); } + if (this->m_databaseWriter) { this->m_databaseWriter->gracefulShutdown(); } } const CLogCategoryList &CWebDataServices::getLogCategories() diff --git a/src/blackmisc/threadedreader.cpp b/src/blackmisc/threadedreader.cpp index 5fa828247..5f82d7447 100644 --- a/src/blackmisc/threadedreader.cpp +++ b/src/blackmisc/threadedreader.cpp @@ -19,6 +19,11 @@ namespace BlackMisc m_updateTimer(new QTimer(this)) { } + bool CThreadedReader::isFinishedOrShutdown() const + { + return m_shutdown || isFinished(); + } + QDateTime CThreadedReader::getUpdateTimestamp() const { QReadLocker lock(&this->m_lock); diff --git a/src/blackmisc/threadedreader.h b/src/blackmisc/threadedreader.h index acf2cfeaa..2255a0bb3 100644 --- a/src/blackmisc/threadedreader.h +++ b/src/blackmisc/threadedreader.h @@ -21,6 +21,7 @@ #include #include #include +#include namespace BlackMisc { @@ -57,16 +58,20 @@ namespace BlackMisc int interval() const; //! Graceful shutdown + //! \threadsafe void gracefulShutdown(); protected: //! Constructor CThreadedReader(QObject *owner, const QString &name); - QTimer *m_updateTimer = nullptr; //!< update timer - bool m_shutdown = false; //!< in shutdown process + QTimer *m_updateTimer = nullptr; //!< update timer + std::atomic m_shutdown { false }; //!< in shutdown process mutable QReadWriteLock m_lock {QReadWriteLock::Recursive}; //!< lock which can be used from the derived classes + //! Shutdown in progress or finished + bool isFinishedOrShutdown() const; + //! Make sure everthing runs correctly in own thread void threadAssertCheck() const;