ipa: raspberrypi: AWB: Improve locking
Fix a couple of places where notify_one() was called with the lock
held. Also restartAsync doesn't need the lock for its entire duration.
This change exactly matches commit db552b0b92
("libcamera: ipa:
raspberrypi: ALSC: Improve locking in a few places") where we do the
same for ALSC (the asynchronous thread arrangement there is identical).
Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
3a1b50876c
commit
a03cd6af11
1 changed files with 6 additions and 4 deletions
|
@ -136,8 +136,8 @@ Awb::~Awb()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
async_abort_ = true;
|
async_abort_ = true;
|
||||||
async_signal_.notify_one();
|
|
||||||
}
|
}
|
||||||
|
async_signal_.notify_one();
|
||||||
async_thread_.join();
|
async_thread_.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,11 +239,14 @@ void Awb::restartAsync(StatisticsPtr &stats, double lux)
|
||||||
: (mode_ == nullptr ? config_.default_mode : mode_);
|
: (mode_ == nullptr ? config_.default_mode : mode_);
|
||||||
lux_ = lux;
|
lux_ = lux;
|
||||||
frame_phase_ = 0;
|
frame_phase_ = 0;
|
||||||
async_start_ = true;
|
|
||||||
async_started_ = true;
|
async_started_ = true;
|
||||||
size_t len = mode_name_.copy(async_results_.mode,
|
size_t len = mode_name_.copy(async_results_.mode,
|
||||||
sizeof(async_results_.mode) - 1);
|
sizeof(async_results_.mode) - 1);
|
||||||
async_results_.mode[len] = '\0';
|
async_results_.mode[len] = '\0';
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
async_start_ = true;
|
||||||
|
}
|
||||||
async_signal_.notify_one();
|
async_signal_.notify_one();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,7 +300,6 @@ void Awb::Process(StatisticsPtr &stats, Metadata *image_metadata)
|
||||||
LOG(RPiAwb, Debug) << "No lux metadata found";
|
LOG(RPiAwb, Debug) << "No lux metadata found";
|
||||||
LOG(RPiAwb, Debug) << "Awb lux value is " << lux_status.lux;
|
LOG(RPiAwb, Debug) << "Awb lux value is " << lux_status.lux;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lock(mutex_);
|
|
||||||
if (async_started_ == false)
|
if (async_started_ == false)
|
||||||
restartAsync(stats, lux_status.lux);
|
restartAsync(stats, lux_status.lux);
|
||||||
}
|
}
|
||||||
|
@ -319,8 +321,8 @@ void Awb::asyncFunc()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
async_finished_ = true;
|
async_finished_ = true;
|
||||||
sync_signal_.notify_one();
|
|
||||||
}
|
}
|
||||||
|
sync_signal_.notify_one();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue