From a03cd6af11f99f21b58276ad3ab5527a97a4ed88 Mon Sep 17 00:00:00 2001 From: David Plowman Date: Thu, 4 Feb 2021 09:34:52 +0000 Subject: 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 db552b0b925a ("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 Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- src/ipa/raspberrypi/controller/rpi/awb.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp b/src/ipa/raspberrypi/controller/rpi/awb.cpp index dabab726..791b5108 100644 --- a/src/ipa/raspberrypi/controller/rpi/awb.cpp +++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp @@ -136,8 +136,8 @@ Awb::~Awb() { std::lock_guard lock(mutex_); async_abort_ = true; - async_signal_.notify_one(); } + async_signal_.notify_one(); async_thread_.join(); } @@ -239,11 +239,14 @@ void Awb::restartAsync(StatisticsPtr &stats, double lux) : (mode_ == nullptr ? config_.default_mode : mode_); lux_ = lux; frame_phase_ = 0; - async_start_ = true; async_started_ = true; size_t len = mode_name_.copy(async_results_.mode, sizeof(async_results_.mode) - 1); async_results_.mode[len] = '\0'; + { + std::lock_guard lock(mutex_); + async_start_ = true; + } 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) << "Awb lux value is " << lux_status.lux; - std::unique_lock lock(mutex_); if (async_started_ == false) restartAsync(stats, lux_status.lux); } @@ -319,8 +321,8 @@ void Awb::asyncFunc() { std::lock_guard lock(mutex_); async_finished_ = true; - sync_signal_.notify_one(); } + sync_signal_.notify_one(); } } -- cgit v1.2.1