refs #369, thread safe access to aircraft parts, situations

This commit is contained in:
Klaus Basan
2015-02-13 21:54:53 +01:00
parent c47871b813
commit 38a8c45b9e
8 changed files with 165 additions and 28 deletions

View File

@@ -59,6 +59,76 @@ namespace BlackCore
this->connect(&this->m_atcWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_atcControllerDisconnected);
}
const CSimulatedAircraftList &CAirspaceMonitor::renderedAircraft() const
{
// not thread safe, check
Q_ASSERT(this->thread() == QThread::currentThread());
return m_aircraftInRange;
}
CSimulatedAircraftList &CAirspaceMonitor::renderedAircraft()
{
// not thread safe, check
Q_ASSERT(this->thread() == QThread::currentThread());
return m_aircraftInRange;
}
const CAircraftSituationList &CAirspaceMonitor::renderedAircraftSituations() const
{
// not thread safe, check
Q_ASSERT(this->thread() == QThread::currentThread());
return m_aircraftSituations;
}
CAircraftSituationList &CAirspaceMonitor::renderedAircraftSituations()
{
// not thread safe, check
Q_ASSERT(this->thread() == QThread::currentThread());
return m_aircraftSituations;
}
CAircraftSituationList CAirspaceMonitor::getRenderedAircraftSituations() const
{
if (this->thread() == QThread::currentThread()) { return this->m_aircraftSituations; }
CAircraftSituationList situations;
bool s = QMetaObject::invokeMethod(const_cast<CAirspaceMonitor *>(this), // strip away const, invoke will not change anything,
"getRenderedAircraftSituations",
Qt::BlockingQueuedConnection,
Q_RETURN_ARG(CAircraftSituationList, situations)
);
Q_ASSERT(s);
Q_UNUSED(s);
return situations;
}
const CAircraftPartsList &CAirspaceMonitor::renderedAircraftParts() const
{
// not thread safe, check
Q_ASSERT(this->thread() == QThread::currentThread());
return m_aircraftParts;
}
CAircraftPartsList &CAirspaceMonitor::renderedAircraftParts()
{
// not thread safe, check
Q_ASSERT(this->thread() == QThread::currentThread());
return m_aircraftParts;
}
CAircraftPartsList CAirspaceMonitor::getRenderedAircraftParts() const
{
if (this->thread() == QThread::currentThread()) { return this->m_aircraftParts; }
CAircraftPartsList parts;
bool s = QMetaObject::invokeMethod(const_cast<CAirspaceMonitor *>(this), // strip away const, invoke will not change anything
"getRenderedAircraftParts",
Qt::BlockingQueuedConnection,
Q_RETURN_ARG(CAircraftPartsList, parts)
);
Q_ASSERT(s);
Q_UNUSED(s);
return parts;
}
bool CAirspaceMonitor::updateAircraftEnabled(const CCallsign &callsign, bool enabledForRedering, const QString &originator)
{
CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexEnabled, CVariant::fromValue(enabledForRedering));

View File

@@ -44,22 +44,22 @@ namespace BlackCore
CAirspaceMonitor(QObject *parent, const BlackMisc::Simulation::IOwnAircraftProviderReadOnly *ownAircraft, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile);
//! \copydoc IRenderedAircraftProviderReadOnly::renderedAircraft
virtual const BlackMisc::Simulation::CSimulatedAircraftList &renderedAircraft() const override { return m_aircraftInRange; }
virtual const BlackMisc::Simulation::CSimulatedAircraftList &renderedAircraft() const override;
//! \copydoc IRenderedAircraftProvider::renderedAircraft
virtual BlackMisc::Simulation::CSimulatedAircraftList &renderedAircraft() override { return m_aircraftInRange; }
virtual BlackMisc::Simulation::CSimulatedAircraftList &renderedAircraft() override;
//! \copydoc IRenderedAircraftProvider::renderedAircraftSituations
virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const override { return m_aircraftSituations; }
virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const override;
//! \copydoc IRenderedAircraftProvider::renderedAircraftSituations
virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() override { return m_aircraftSituations; }
virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() override;
//! \copydoc IRenderedAircraftProvider::renderedAircraftParts
virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const override { return m_aircraftParts; }
virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const override;
//! \copydoc IRenderedAircraftProvider::renderedAircraftParts
virtual BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() override { return m_aircraftParts; }
virtual BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() override;
//! \copydoc IRenderedAircraftProvider::renderedAircraftParts
virtual bool updateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRedering, const QString &originator) override;
@@ -95,6 +95,9 @@ namespace BlackCore
//! Returns the closest ATC station operating on the given frequency, if any
BlackMisc::Aviation::CAtcStation getAtcStationForComUnit(const BlackMisc::Aviation::CComSystem &comSystem);
//! Clear the contents
void clear();
//! Request to update other clients' data from the network
void requestDataUpdates();
@@ -104,6 +107,13 @@ namespace BlackCore
//! Create dummy entries for performance tests
void testCreateDummyOnlineAtcStations(int number);
public slots:
//! \copydoc IRenderedAircraftProviderReadOnly::getRenderedAircraftSituations
virtual BlackMisc::Aviation::CAircraftSituationList getRenderedAircraftSituations() const override;
//! \copydoc IRenderedAircraftProviderReadOnly::getRenderedAircraftParts
virtual BlackMisc::Aviation::CAircraftPartsList getRenderedAircraftParts() const override;
signals:
//! Online ATC stations were changed
void changedAtcStationsOnline();
@@ -126,10 +136,6 @@ namespace BlackCore
//! Read for model matching
void readyForModelMatching(const BlackMisc::Simulation::CSimulatedAircraft &renderedAircraft);
public:
//! Clear the contents
void clear();
private:
BlackMisc::Aviation::CAtcStationList m_atcStationsOnline;
BlackMisc::Aviation::CAtcStationList m_atcStationsBooked;

View File

@@ -103,6 +103,12 @@ namespace BlackCore
return m_airspace->renderedAircraftSituations();
}
CAircraftSituationList CContextNetwork::getRenderedAircraftSituations() const
{
Q_ASSERT(this->m_airspace);
return m_airspace->getRenderedAircraftSituations();
}
const CAircraftSituationList &CContextNetwork::renderedAircraftSituations() const
{
Q_ASSERT(this->m_airspace);
@@ -121,6 +127,12 @@ namespace BlackCore
return m_airspace->renderedAircraftParts();
}
CAircraftPartsList CContextNetwork::getRenderedAircraftParts() const
{
Q_ASSERT(this->m_airspace);
return m_airspace->getRenderedAircraftParts();
}
void CContextNetwork::gracefulShutdown()
{
if (this->m_vatsimBookingReader) { this->m_vatsimBookingReader->requestStop(); this->m_vatsimBookingReader->quit(); }
@@ -332,6 +344,18 @@ namespace BlackCore
this->m_vatsimBookingReader->readInBackgroundThread();
}
CAtcStationList CContextNetwork::getAtcStationsOnline() const
{
BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
return this->m_airspace->getAtcStationsOnline();
}
CAtcStationList CContextNetwork::getAtcStationsBooked() const
{
BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
return this->m_airspace->getAtcStationsBooked();
}
CSimulatedAircraftList CContextNetwork::getAircraftInRange() const
{
BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;

View File

@@ -60,7 +60,7 @@ namespace BlackCore
//! \copydoc IRenderedAircraftProviderReadOnly::renderedAircraftSituations
virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() override;
//! \copydoc IRenderedAircraftProvider::renderedAircraftParts
//! \copydoc IRenderedAircraftProviderReadOnly::renderedAircraftParts
virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const override;
//! \copydoc IRenderedAircraftProvider::renderedAircraftParts
@@ -72,18 +72,10 @@ namespace BlackCore
virtual void readAtcBookingsFromSource() const override;
//! \copydoc IContextNetwork::getAtcStationsOnline()
virtual BlackMisc::Aviation::CAtcStationList getAtcStationsOnline() const override
{
BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
return this->m_airspace->getAtcStationsOnline();
}
virtual BlackMisc::Aviation::CAtcStationList getAtcStationsOnline() const override;
//! \copydoc IContextNetwork::getAtcStationsBooked()
virtual BlackMisc::Aviation::CAtcStationList getAtcStationsBooked() const override
{
BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
return this->m_airspace->getAtcStationsBooked();
}
virtual BlackMisc::Aviation::CAtcStationList getAtcStationsBooked() const override;
//! \copydoc IContextNetwork::getAircraftInRange()
virtual BlackMisc::Simulation::CSimulatedAircraftList getAircraftInRange() const override;
@@ -91,6 +83,12 @@ namespace BlackCore
//! \copydoc IContextNetwork::getAircraftForCallsign
virtual BlackMisc::Simulation::CSimulatedAircraft getAircraftForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
//! \copydoc IRenderedAircraftProviderReadOnly::getRenderedAircraftSituations
virtual BlackMisc::Aviation::CAircraftSituationList getRenderedAircraftSituations() const override;
//! \copydoc IRenderedAircraftProviderReadOnly::getRenderedAircraftParts
virtual BlackMisc::Aviation::CAircraftPartsList getRenderedAircraftParts() const override;
//! \copydoc IContextNetwork::connectToNetwork()
virtual BlackMisc::CStatusMessage connectToNetwork(const BlackMisc::Network::CServer &server, uint mode) override;

View File

@@ -39,9 +39,20 @@ namespace BlackCore
CContextOwnAircraft::~CContextOwnAircraft() { }
/*
* Init own aircraft
*/
const CSimulatedAircraft &CContextOwnAircraft::ownAircraft() const
{
// not thread safe, check
Q_ASSERT(this->thread() == QThread::currentThread());
return this->m_ownAircraft;
}
CSimulatedAircraft &CContextOwnAircraft::ownAircraft()
{
// not thread safe, check
Q_ASSERT(this->thread() == QThread::currentThread());
return this->m_ownAircraft;
}
void CContextOwnAircraft::initOwnAircraft()
{
Q_ASSERT(this->getRuntime());
@@ -202,7 +213,16 @@ namespace BlackCore
CSimulatedAircraft CContextOwnAircraft::getOwnAircraft() const
{
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << this->m_ownAircraft;
return this->m_ownAircraft;
if (this->thread() == QThread::currentThread()) { return this->m_ownAircraft; }
CSimulatedAircraft aircraft;
bool s = QMetaObject::invokeMethod(const_cast<CContextOwnAircraft *>(this), // strip away const, invoke will not change anything
"getOwnAircraft",
Qt::BlockingQueuedConnection,
Q_RETURN_ARG(CSimulatedAircraft, aircraft)
);
Q_ASSERT(s);
Q_UNUSED(s);
return aircraft;
}
bool CContextOwnAircraft::parseCommandLine(const QString &commandLine)

View File

@@ -37,14 +37,15 @@ namespace BlackCore
virtual ~CContextOwnAircraft();
//! Own aircraft
virtual const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const override { return this->m_ownAircraft; }
virtual const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const override;
//! Own aircraft
virtual BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() override { return this->m_ownAircraft; }
virtual BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() override;
public slots: // IContextOwnAircraft overrides
//! \copydoc IContextOwnAircraft::getOwnAircraft()
//! \copydoc IOwnAircraftProvider::getOwnAircraft()
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override;
//! \copydoc IContextOwnAircraft::updatePosition

View File

@@ -22,9 +22,14 @@ namespace BlackMisc
class IOwnAircraftProviderReadOnly
{
public:
//! Own aircraft
//! Own aircraft as reference
//! \note in memory, not thread safe!
virtual const CSimulatedAircraft &ownAircraft() const = 0;
//! Own aircraft as copy
//! \note not hread safe!
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const = 0;
//! Destructor
virtual ~IOwnAircraftProviderReadOnly() {}
};
@@ -67,6 +72,9 @@ namespace BlackMisc
//! \copydoc IOwnAircraftProvider::ownAircraft
virtual CSimulatedAircraft &ownAircraft() { return this->m_ownAircraft; }
//! \copydoc IOwnAircraftProvider::getOwnAircraft
virtual CSimulatedAircraft getOwnAircraft() const { return this->m_ownAircraft; }
public slots:
//! \copydoc IOwnAircraftProvider::updateCockpit
virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override;

View File

@@ -30,9 +30,17 @@ namespace BlackMisc
//! All situation (per callsign, time history)
virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const = 0;
//! Rendered aircraft situations (history) as copy
//! \threadsafe
virtual BlackMisc::Aviation::CAircraftSituationList getRenderedAircraftSituations() const = 0;
//! All parts (per callsign, time history)
virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const = 0;
//! All parts (per callsign, time history) as copy
//! \threadsafe
virtual BlackMisc::Aviation::CAircraftPartsList getRenderedAircraftParts() const = 0;
//! Destructor
virtual ~IRenderedAircraftProviderReadOnly() {}
};
@@ -42,12 +50,14 @@ namespace BlackMisc
{
public:
//! All rendered aircraft
//! \note in memory reference, not thread safe
virtual CSimulatedAircraftList &renderedAircraft() = 0;
//! Rendered aircraft situations (history)
virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() = 0;
//! All parts (per callsign, time history)
//! \note in memory reference, not thread safe
virtual BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() = 0;
//! Enable/disable rendering