[libcamera-devel] [PATCH v3 6/8] android: Guard access to the camera state

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun May 23 20:09:17 CEST 2021


Hi Jacopo,

Thank you for the patch.

On Fri, May 21, 2021 at 05:42:25PM +0200, Jacopo Mondi wrote:
> Guard access to the camera state and the start/stop sequences
> with a mutex.
> 
> Currently only stop() and the first call to processCaptureRequest()
> start and stop the camera, and they're not meant to race with each
> other. With the introduction of flush() the camera can be stopped
> concurrently to a processCaptureRequest() call, hence access to the
> camera state will need to be protected.
> 
> Prepare for that by guarding the existing paths with a mutex.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> Reviewed-by: Hirokazu Honda <hiroh at chromium.org>
> ---
>  src/android/camera_device.cpp | 23 ++++++++++++++---------
>  src/android/camera_device.h   |  1 +
>  2 files changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index fceae96a8b7c..6645c019410e 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -759,6 +759,7 @@ void CameraDevice::close()
>  
>  void CameraDevice::stop()
>  {
> +	MutexLocker cameraLock(cameraMutex_);
>  	if (state_ == CameraStopped)
>  		return;
>  
> @@ -1844,17 +1845,21 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
>  	if (!isValidRequest(camera3Request))
>  		return -EINVAL;
>  
> -	/* Start the camera if that's the first request we handle. */
> -	if (state_ == CameraStopped) {
> -		worker_.start();
> +	{
> +		MutexLocker cameraLock(cameraMutex_);
>  
> -		int ret = camera_->start();
> -		if (ret) {
> -			LOG(HAL, Error) << "Failed to start camera";
> -			return ret;
> -		}
> +		/* Start the camera if that's the first request we handle. */
> +		if (state_ == CameraStopped) {
> +			worker_.start();
>  
> -		state_ = CameraRunning;
> +			int ret = camera_->start();
> +			if (ret) {
> +				LOG(HAL, Error) << "Failed to start camera";
> +				return ret;
> +			}
> +
> +			state_ = CameraRunning;
> +		}
>  	}
>  
>  	/*
> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> index 995b423c6deb..6fe5454c6535 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -119,6 +119,7 @@ private:
>  
>  	CameraWorker worker_;
>  
> +	libcamera::Mutex cameraMutex_; /* Protects access to the camera state. */

To make it more explicit that it protects the state, I'd prefer naming
the variable stateMutex_.

The patch looks good, but I suppose I'll see how the mutex is really
used in the next patches. Assuming there's no issue there,

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

>  	State state_;
>  
>  	std::shared_ptr<libcamera::Camera> camera_;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list