[PATCH 4/5] camera: Use invokeMethod() for pipe_->acquire() and pipe_->release()

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Aug 25 02:58:23 CEST 2024


Hi Hans,

Thank you for the patch.

On Tue, Aug 20, 2024 at 09:50:15PM +0200, Hans de Goede wrote:
> Some pipeline handlers may want to open / close /dev/video# nodes
> from pipe_->acquireDevices() / pipe_->releaseDevices().

See my reply to 3/5. I'm fine with doing so in the UVC pipeline handler
now, but not in "some pipeline handlers" before we redesign the
application-facing API.

> V4L2VideoDevice::open() creates an EventNotifier, this notifier needs
> to be created from the CameraManager thread.
> 
> Use invokeMethod() for pipe_->acquire() and pipe_->release() so that
> any EventNotifiers created are created from the CameraManager thread
> context.

This will effectively serialize all calls to acquire() and release(),
removing the need for the functions to be thread-safe. The locks will
also not be needed anymore. Documentation should be updated.

> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  src/libcamera/camera.cpp | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index 4e393f89..61925e83 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -995,7 +995,8 @@ int Camera::acquire()
>  	if (ret < 0)
>  		return ret == -EACCES ? -EBUSY : ret;
>  
> -	if (!d->pipe_->acquire(this)) {
> +	if (!d->pipe_->invokeMethod(&PipelineHandler::acquire,
> +				    ConnectionTypeBlocking, this)) {
>  		LOG(Camera, Info)
>  			<< "Pipeline handler in use by another process";
>  		return -EBUSY;
> @@ -1030,7 +1031,8 @@ int Camera::release()
>  		return ret == -EACCES ? -EBUSY : ret;
>  
>  	if (d->isAcquired())
> -		d->pipe_->release(this);
> +		d->pipe_->invokeMethod(&PipelineHandler::release,
> +				       ConnectionTypeBlocking, this);
>  
>  	d->setState(Private::CameraAvailable);
>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list