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

Hans de Goede hdegoede at redhat.com
Tue Aug 27 16:34:50 CEST 2024


Hi,

On 8/25/24 2:58 AM, Laurent Pinchart wrote:
> 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.

Ack, I'll update the commit message for v2.

>> 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.

Good point about the locks no longer being needed because of
the invokeMethod call serializing things. I'll drop the lock_
and I'll update the \context of acquire[Device]() and
release[Device]() to match.

Regards,

Hans


>> 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);
>>  
> 



More information about the libcamera-devel mailing list