[libcamera-devel] [PATCH 1/1] fix: pipeline handlers: Stop exponential explosive calls to createPipelineHandlers

Umang Jain umang.jain at ideasonboard.com
Mon Mar 6 06:09:59 CET 2023


HI Sophie,

Thank you for the patch

On 3/6/23 4:36 AM, Sophie Friedrich via libcamera-devel wrote:
> Currently the method `createPipelineHandlers` registered itself to the
> `devicesAdded` signal at the end of each call. As the Signal object
> supports multiple non-unique listeners connected to it, the former
s/listeners/slots maybe ?
> method would be called exponentially often with each new emitted event
> on `devicesAdded` (i.e. with udev plugging in a new camera)

indeed, quite a bug!
>
> By attaching the `createPipelineHandlers` function to `devicesAdded` during
> the first call to it / init of the `CameraManager::Private` this effect
> is prevented.

Would repharase a bit to :

Fix it by registering the createPipelineHandlers() slot to 
`devicesAdded` signal in
CameraManager::Private::init() instead. This will prevent the slot 
getting registered
multiple times to the `devicesAdded` signal.
>
> Signed-off-by: Sophie Friedrich <dev at flowerpot.me>

LGTM

Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>

> ---
>   src/libcamera/camera_manager.cpp | 3 +--
>   1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
> index b1785f75..c1edefda 100644
> --- a/src/libcamera/camera_manager.cpp
> +++ b/src/libcamera/camera_manager.cpp
> @@ -131,6 +131,7 @@ int CameraManager::Private::init()
>   		return -ENODEV;
>   
>   	createPipelineHandlers();
> +	enumerator_->devicesAdded.connect(this, &Private::createPipelineHandlers);
>   
>   	return 0;
>   }
> @@ -165,8 +166,6 @@ void CameraManager::Private::createPipelineHandlers()
>   				<< "\" matched";
>   		}
>   	}
> -
> -	enumerator_->devicesAdded.connect(this, &Private::createPipelineHandlers);
>   }
>   
>   void CameraManager::Private::cleanup()



More information about the libcamera-devel mailing list