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:
David Plowman 2021-02-04 09:34:52 +00:00 committed by Laurent Pinchart
parent 3a1b50876c
commit a03cd6af11

View file

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