diff --git a/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp b/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp index aad94b14..6ec5e1a8 100644 --- a/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/radar_product_layer.cpp @@ -148,8 +148,6 @@ void RadarProductLayer::UpdateSweep() { BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "UpdateSweep()"; - p->sweepNeedsUpdate_ = false; - gl::OpenGLFunctions& gl = context()->gl_; boost::timer::cpu_timer timer; @@ -157,6 +155,17 @@ void RadarProductLayer::UpdateSweep() std::shared_ptr radarProductView = context()->radarProductView_; + std::unique_lock sweepLock(radarProductView->sweep_mutex(), + std::try_to_lock); + if (!sweepLock.owns_lock()) + { + BOOST_LOG_TRIVIAL(debug) + << logPrefix_ << "Sweep locked, deferring update"; + return; + } + + p->sweepNeedsUpdate_ = false; + const std::vector& vertices = radarProductView->vertices(); // Bind a vertex array object diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp index 81615b73..e5f4f949 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -353,6 +353,8 @@ void Level2ProductView::ComputeSweep() return; } + std::scoped_lock sweepLock(sweep_mutex()); + std::shared_ptr radarData; std::tie(radarData, p->elevationCut_, p->elevationCuts_) = p->radarProductManager_->GetLevel2Data( diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp index 0ddc78fa..cc96917a 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp @@ -24,8 +24,10 @@ static const uint16_t DEFAULT_COLOR_TABLE_MAX = 255u; class RadarProductViewImpl { public: - explicit RadarProductViewImpl() = default; - ~RadarProductViewImpl() = default; + explicit RadarProductViewImpl() : sweepMutex_ {} {} + ~RadarProductViewImpl() = default; + + std::mutex sweepMutex_; }; RadarProductView::RadarProductView() : @@ -63,6 +65,11 @@ std::chrono::system_clock::time_point RadarProductView::sweep_time() const return {}; } +std::mutex& RadarProductView::sweep_mutex() +{ + return p->sweepMutex_; +} + void RadarProductView::Initialize() { ComputeSweep(); diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp index bb3658a8..a21fc460 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -35,12 +36,14 @@ public: virtual uint16_t vcp() const = 0; virtual const std::vector& vertices() const = 0; + std::mutex& sweep_mutex(); + void Initialize(); virtual void LoadColorTable(std::shared_ptr colorTable) = 0; virtual void SelectElevation(float elevation); virtual void SelectTime(std::chrono::system_clock::time_point time) = 0; - virtual void Update() = 0; + virtual void Update() = 0; virtual common::RadarProductGroup GetRadarProductGroup() const = 0; virtual std::string GetRadarProductName() const = 0;