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

View file

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

View file

@ -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();

View file

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