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

Hans de Goede hdegoede at redhat.com
Tue Aug 27 16:28:31 CEST 2024


Hi Harvey,

On 8/21/24 7:32 PM, Cheng-Hao Yang wrote:
> Hi Hans,
> 
> Ah I left the comments on the 1st/5 patch too early. Should've checked all
> patches in this series first.
> 
> IIUC, the users of libcamera should only get access to `libcamera::Camera`'s
> APIs, which are the only callers of `libcamera::PipelineHandler`'s APIs.
> If this is correct, I agree that we don't need to make `PipelineHandler::acquire`
> and `PipelineHandler::release` thread-safe.
> 
> If we go with this patch, we can remove `PipelineHandler::lock_`, and the
> descriptions of the two functions should be updated.

`PipelineHandler::lock_` is still useful when PipelineHandler::acquire() /
PipelineHandler::release() are called at the same time from different
threads for 2 different cameras.

When this happens we still need the lock to make sure the useCount_ variable
updating works properly.

Regards,

Hans



> On Tue, Aug 20, 2024 at 9:50 PM Hans de Goede <hdegoede at redhat.com <mailto:hdegoede at redhat.com>> wrote:
> 
>     Some pipeline handlers may want to open / close /dev/video# nodes
>     from pipe_->acquireDevices() / pipe_->releaseDevices().
> 
>     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.
> 
>     Signed-off-by: Hans de Goede <hdegoede at redhat.com <mailto: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);
> 
>     -- 
>     2.46.0
> 



More information about the libcamera-devel mailing list