Create sweep mutex to eliminate race condition between ComputeSweep() and UpdateSweep()

This commit is contained in:
Dan Paulat 2022-04-03 19:19:14 -05:00
parent b2fbfa0dee
commit 4c6a40140b
4 changed files with 26 additions and 5 deletions

View file

@ -148,8 +148,6 @@ void RadarProductLayer::UpdateSweep()
{ {
BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "UpdateSweep()"; BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "UpdateSweep()";
p->sweepNeedsUpdate_ = false;
gl::OpenGLFunctions& gl = context()->gl_; gl::OpenGLFunctions& gl = context()->gl_;
boost::timer::cpu_timer timer; boost::timer::cpu_timer timer;
@ -157,6 +155,17 @@ void RadarProductLayer::UpdateSweep()
std::shared_ptr<view::RadarProductView> radarProductView = std::shared_ptr<view::RadarProductView> radarProductView =
context()->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<float>& vertices = radarProductView->vertices(); const std::vector<float>& vertices = radarProductView->vertices();
// Bind a vertex array object // Bind a vertex array object

View file

@ -353,6 +353,8 @@ void Level2ProductView::ComputeSweep()
return; return;
} }
std::scoped_lock sweepLock(sweep_mutex());
std::shared_ptr<wsr88d::rda::ElevationScan> radarData; std::shared_ptr<wsr88d::rda::ElevationScan> radarData;
std::tie(radarData, p->elevationCut_, p->elevationCuts_) = std::tie(radarData, p->elevationCut_, p->elevationCuts_) =
p->radarProductManager_->GetLevel2Data( p->radarProductManager_->GetLevel2Data(

View file

@ -24,8 +24,10 @@ static const uint16_t DEFAULT_COLOR_TABLE_MAX = 255u;
class RadarProductViewImpl class RadarProductViewImpl
{ {
public: public:
explicit RadarProductViewImpl() = default; explicit RadarProductViewImpl() : sweepMutex_ {} {}
~RadarProductViewImpl() = default; ~RadarProductViewImpl() = default;
std::mutex sweepMutex_;
}; };
RadarProductView::RadarProductView() : RadarProductView::RadarProductView() :
@ -63,6 +65,11 @@ std::chrono::system_clock::time_point RadarProductView::sweep_time() const
return {}; return {};
} }
std::mutex& RadarProductView::sweep_mutex()
{
return p->sweepMutex_;
}
void RadarProductView::Initialize() void RadarProductView::Initialize()
{ {
ComputeSweep(); ComputeSweep();

View file

@ -5,6 +5,7 @@
#include <chrono> #include <chrono>
#include <memory> #include <memory>
#include <mutex>
#include <vector> #include <vector>
#include <QObject> #include <QObject>
@ -35,12 +36,14 @@ public:
virtual uint16_t vcp() const = 0; virtual uint16_t vcp() const = 0;
virtual const std::vector<float>& vertices() const = 0; virtual const std::vector<float>& vertices() const = 0;
std::mutex& sweep_mutex();
void Initialize(); void Initialize();
virtual void virtual void
LoadColorTable(std::shared_ptr<common::ColorTable> colorTable) = 0; LoadColorTable(std::shared_ptr<common::ColorTable> colorTable) = 0;
virtual void SelectElevation(float elevation); virtual void SelectElevation(float elevation);
virtual void SelectTime(std::chrono::system_clock::time_point time) = 0; 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 common::RadarProductGroup GetRadarProductGroup() const = 0;
virtual std::string GetRadarProductName() const = 0; virtual std::string GetRadarProductName() const = 0;