mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-03 07:35:48 +08:00
refs #369, thread safe access to aircraft parts, situations
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user