refs #667 Interpolator: relaxed thread safety requirements by removing the dependence on shared state.

This commit is contained in:
Mathew Sutcliffe
2016-06-06 19:55:42 +01:00
parent 9666c02adc
commit f82a3b53e4
4 changed files with 44 additions and 10 deletions

View File

@@ -24,7 +24,30 @@ namespace BlackMisc
this->setObjectName(objectName); this->setObjectName(objectName);
} }
CAircraftPartsList IInterpolator::getPartsBeforeTime(const CCallsign &callsign, qint64 cutoffTime, BlackMisc::IInterpolator::PartsStatus &partsStatus) BlackMisc::Aviation::CAircraftSituation IInterpolator::getInterpolatedSituation(const BlackMisc::Aviation::CCallsign &callsign, qint64 currentTimeSinceEpoc,
bool isVtolAircraft, InterpolationStatus &status) const
{
// has to be thread safe
status.reset();
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign");
auto currentSituation = this->getInterpolatedSituation(this->remoteAircraftSituations(callsign), currentTimeSinceEpoc, isVtolAircraft, status);
Q_ASSERT_X(currentSituation.getCallsign() == callsign, Q_FUNC_INFO, "mismatching callsigns");
return currentSituation;
}
CAircraftPartsList IInterpolator::getPartsBeforeTime(const CAircraftPartsList &parts, qint64 cutoffTime, BlackMisc::IInterpolator::PartsStatus &partsStatus) const
{
partsStatus.reset();
partsStatus.supportsParts = true;
if (cutoffTime < 0) { return parts; }
return parts.findBefore(cutoffTime);
}
CAircraftPartsList IInterpolator::getPartsBeforeTime(const CCallsign &callsign, qint64 cutoffTime, BlackMisc::IInterpolator::PartsStatus &partsStatus) const
{ {
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign"); Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign");
partsStatus.reset(); partsStatus.reset();

View File

@@ -68,14 +68,26 @@ namespace BlackMisc
//! Current interpolated situation //! Current interpolated situation
//! \threadsafe //! \threadsafe
virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation( virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(
const BlackMisc::Aviation::CCallsign &callsign, qint64 currentTimeSinceEpoc, const BlackMisc::Aviation::CAircraftSituationList &situations, qint64 currentTimeSinceEpoc,
bool isVtolAircraft, InterpolationStatus &status) const = 0; bool isVtolAircraft, InterpolationStatus &status) const = 0;
//! Current interpolated situation
//! \threadsafe
virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(
const BlackMisc::Aviation::CCallsign &callsign, qint64 currentTimeSinceEpoc,
bool isVtolAircraft, InterpolationStatus &status) const;
//! Parts before given offset time (aka pending parts)
//! \threadsafe
virtual BlackMisc::Aviation::CAircraftPartsList getPartsBeforeTime(
const BlackMisc::Aviation::CAircraftPartsList &parts, qint64 cutoffTime,
PartsStatus &partsStatus) const;
//! Parts before given offset time (aka pending parts) //! Parts before given offset time (aka pending parts)
//! \threadsafe //! \threadsafe
virtual BlackMisc::Aviation::CAircraftPartsList getPartsBeforeTime( virtual BlackMisc::Aviation::CAircraftPartsList getPartsBeforeTime(
const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTime, const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTime,
PartsStatus &partsStatus); PartsStatus &partsStatus) const;
//! Enable debug messages //! Enable debug messages
void enableDebugMessages(bool enabled); void enableDebugMessages(bool enabled);

View File

@@ -36,19 +36,17 @@ using namespace BlackMisc::Aviation;
namespace BlackMisc namespace BlackMisc
{ {
CAircraftSituation CInterpolatorLinear::getInterpolatedSituation(const CCallsign &callsign, qint64 currentTimeMsSinceEpoc, bool vtolAiracraft, InterpolationStatus &status) const CAircraftSituation CInterpolatorLinear::getInterpolatedSituation(const BlackMisc::Aviation::CAircraftSituationList &situations, qint64 currentTimeMsSinceEpoc, bool vtolAiracraft, InterpolationStatus &status) const
{ {
// has to be thread safe // has to be thread safe
status.reset(); status.reset();
// any data at all? // any data at all?
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign"); if (situations.isEmpty()) { return {}; }
if (this->remoteAircraftSituationsCount(callsign) < 1) { return {}; }
// data, split situations by time // data, split situations by time
if (currentTimeMsSinceEpoc < 0) { currentTimeMsSinceEpoc = QDateTime::currentMSecsSinceEpoch(); } if (currentTimeMsSinceEpoc < 0) { currentTimeMsSinceEpoc = QDateTime::currentMSecsSinceEpoch(); }
const auto situations = remoteAircraftSituations(callsign);
// find the first situation not in the correct order, keep only the situations before that one // find the first situation not in the correct order, keep only the situations before that one
auto end = std::is_sorted_until(situations.begin(), situations.end(), [](auto &&a, auto &&b) { return b.getAdjustedMSecsSinceEpoch() < a.getAdjustedMSecsSinceEpoch(); }); auto end = std::is_sorted_until(situations.begin(), situations.end(), [](auto &&a, auto &&b) { return b.getAdjustedMSecsSinceEpoch() < a.getAdjustedMSecsSinceEpoch(); });
@@ -110,7 +108,7 @@ namespace BlackMisc
{ {
if (this->m_withDebugMsg) if (this->m_withDebugMsg)
{ {
CLogMessage(this).warning("Extrapolation, fraction > 1: %1 for callsign: %2") << simulationTimeFraction << callsign; CLogMessage(this).warning("Extrapolation, fraction > 1: %1 for callsign: %2") << simulationTimeFraction << oldSituation.getCallsign();
} }
} }
@@ -182,7 +180,6 @@ namespace BlackMisc
* simulationTimeFraction * simulationTimeFraction
+ oldSituation.getGroundSpeed()); + oldSituation.getGroundSpeed());
status.changedPosition = true; status.changedPosition = true;
Q_ASSERT_X(currentSituation.getCallsign() == callsign, Q_FUNC_INFO, "mismatching callsigns");
return currentSituation; return currentSituation;
} }

View File

@@ -36,7 +36,9 @@ namespace BlackMisc
{} {}
//! \copydoc IInterpolator::getInterpolatedSituation //! \copydoc IInterpolator::getInterpolatedSituation
virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(const BlackMisc::Aviation::CCallsign &callsign, qint64 currentTimeSinceEpoc, bool vtolAiracraft, InterpolationStatus &status) const override; virtual BlackMisc::Aviation::CAircraftSituation getInterpolatedSituation(const BlackMisc::Aviation::CAircraftSituationList &situations, qint64 currentTimeSinceEpoc, bool vtolAiracraft, InterpolationStatus &status) const override;
using IInterpolator::getInterpolatedSituation;
//! Log category //! Log category
static QString getLogCategory() { return "swift.interpolatorlinear"; } static QString getLogCategory() { return "swift.interpolatorlinear"; }