[libcamera-devel,v2,2/4] libcamera: ipa: raspberrypi: ALSC: Improve locking in a few places

Message ID 20200731140801.13253-3-david.plowman@raspberrypi.com
State Superseded
Headers show
Series
  • Raspberry Pi ALSC improvements
Related show

Commit Message

David Plowman July 31, 2020, 2:07 p.m. UTC
Fix up a few locations where we call notify_one() with the lock
held. In particular, restartAsync does not need to be called with the
lock held for its entire duration.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
---
 src/ipa/raspberrypi/controller/rpi/alsc.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

Comments

Laurent Pinchart July 31, 2020, 9:13 p.m. UTC | #1
Hi David,

Thank you for the patch.

On Fri, Jul 31, 2020 at 03:07:59PM +0100, David Plowman wrote:
> Fix up a few locations where we call notify_one() with the lock
> held. In particular, restartAsync does not need to be called with the
> lock held for its entire duration.
> 
> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  src/ipa/raspberrypi/controller/rpi/alsc.cpp | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
> index 76e2f04..12359dc 100644
> --- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp
> +++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
> @@ -32,8 +32,8 @@ Alsc::~Alsc()
>  	{
>  		std::lock_guard<std::mutex> lock(mutex_);
>  		async_abort_ = true;
> -		async_signal_.notify_one();
>  	}
> +	async_signal_.notify_one();
>  	async_thread_.join();
>  }
>  
> @@ -268,8 +268,11 @@ void Alsc::restartAsync(StatisticsPtr &stats, Metadata *image_metadata)
>  	frame_phase_ = 0;
>  	// copy the camera mode so it won't change during the calculations
>  	async_camera_mode_ = camera_mode_;
> -	async_start_ = true;
>  	async_started_ = true;
> +	{
> +		std::lock_guard<std::mutex> lock(mutex_);
> +		async_start_ = true;
> +	}
>  	async_signal_.notify_one();
>  }
>  
> @@ -315,7 +318,6 @@ void Alsc::Process(StatisticsPtr &stats, Metadata *image_metadata)
>  	RPI_LOG("Alsc: frame_phase " << frame_phase_);
>  	if (frame_phase_ >= (int)config_.frame_period ||
>  	    frame_count2_ < (int)config_.startup_frames) {
> -		std::unique_lock<std::mutex> lock(mutex_);
>  		if (async_started_ == false) {
>  			RPI_LOG("ALSC thread starting");
>  			restartAsync(stats, image_metadata);
> @@ -339,8 +341,8 @@ void Alsc::asyncFunc()
>  		{
>  			std::lock_guard<std::mutex> lock(mutex_);
>  			async_finished_ = true;
> -			sync_signal_.notify_one();
>  		}
> +		sync_signal_.notify_one();
>  	}
>  }
>

Patch

diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
index 76e2f04..12359dc 100644
--- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
@@ -32,8 +32,8 @@  Alsc::~Alsc()
 	{
 		std::lock_guard<std::mutex> lock(mutex_);
 		async_abort_ = true;
-		async_signal_.notify_one();
 	}
+	async_signal_.notify_one();
 	async_thread_.join();
 }
 
@@ -268,8 +268,11 @@  void Alsc::restartAsync(StatisticsPtr &stats, Metadata *image_metadata)
 	frame_phase_ = 0;
 	// copy the camera mode so it won't change during the calculations
 	async_camera_mode_ = camera_mode_;
-	async_start_ = true;
 	async_started_ = true;
+	{
+		std::lock_guard<std::mutex> lock(mutex_);
+		async_start_ = true;
+	}
 	async_signal_.notify_one();
 }
 
@@ -315,7 +318,6 @@  void Alsc::Process(StatisticsPtr &stats, Metadata *image_metadata)
 	RPI_LOG("Alsc: frame_phase " << frame_phase_);
 	if (frame_phase_ >= (int)config_.frame_period ||
 	    frame_count2_ < (int)config_.startup_frames) {
-		std::unique_lock<std::mutex> lock(mutex_);
 		if (async_started_ == false) {
 			RPI_LOG("ALSC thread starting");
 			restartAsync(stats, image_metadata);
@@ -339,8 +341,8 @@  void Alsc::asyncFunc()
 		{
 			std::lock_guard<std::mutex> lock(mutex_);
 			async_finished_ = true;
-			sync_signal_.notify_one();
 		}
+		sync_signal_.notify_one();
 	}
 }