From c69ebae324dbeb6ea5824ab84d90b524b604eb79 Mon Sep 17 00:00:00 2001 From: Andy Ford Date: Sun, 3 Apr 2022 11:38:01 +0100 Subject: [PATCH] fix(oceanic): Crash when updating clearances The map was being cleared during update which in turn caused issues if the map was being accessed for tag items. Fixes #455 --- src/plugin/oceanic/OceanicEventHandler.cpp | 5 +++++ src/plugin/oceanic/OceanicEventHandler.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/plugin/oceanic/OceanicEventHandler.cpp b/src/plugin/oceanic/OceanicEventHandler.cpp index 6251dd725..994a4681a 100644 --- a/src/plugin/oceanic/OceanicEventHandler.cpp +++ b/src/plugin/oceanic/OceanicEventHandler.cpp @@ -42,6 +42,7 @@ namespace UKControllerPlugin::Oceanic { } // Loop the clearances and update local data + auto lock = std::lock_guard(this->clearanceMapMutex); this->clearances.clear(); for (const nlohmann::json& clearance : clearanceData) { if (!NattrakClearanceValid(clearance)) { @@ -86,11 +87,13 @@ namespace UKControllerPlugin::Oceanic { auto OceanicEventHandler::CountClearances() const -> size_t { + auto lock = std::lock_guard(this->clearanceMapMutex); return this->clearances.size(); } auto OceanicEventHandler::GetClearanceForCallsign(const std::string& callsign) const -> const Clearance& { + auto lock = std::lock_guard(this->clearanceMapMutex); auto clearance = this->clearances.find(callsign); return clearance == this->clearances.cend() ? this->invalidClearance : clearance->second; } @@ -121,6 +124,7 @@ namespace UKControllerPlugin::Oceanic { const std::string& context, const POINT& mousePos) { + auto lock = std::lock_guard(this->clearanceMapMutex); auto storedClearance = this->clearances.find(flightplan.GetCallsign()); this->currentlySelectedClearance = storedClearance != this->clearances.cend() ? storedClearance->second @@ -134,6 +138,7 @@ namespace UKControllerPlugin::Oceanic { void OceanicEventHandler::SetTagItemData(Tag::TagData& tagData) { + auto lock = std::lock_guard(this->clearanceMapMutex); auto clearance = this->clearances.find(tagData.GetFlightplan().GetCallsign()); if (clearance == this->clearances.cend()) { diff --git a/src/plugin/oceanic/OceanicEventHandler.h b/src/plugin/oceanic/OceanicEventHandler.h index 1a2982141..7f94de208 100644 --- a/src/plugin/oceanic/OceanicEventHandler.h +++ b/src/plugin/oceanic/OceanicEventHandler.h @@ -92,5 +92,8 @@ namespace UKControllerPlugin::Oceanic { static const int CLEARANCE_ENTRY_POINT_TAG_ITEM_ID = 121; static const int CLEARANCE_TRACK_TAG_ITEM_ID = 122; static const int CLEARANCE_ENTRY_ESTIMATE_TAG_ITEM_ID = 123; + + // Protects the map during updates + mutable std::mutex clearanceMapMutex; }; } // namespace UKControllerPlugin::Oceanic