Message ID | 20190511091907.10050-12-niklas.soderlund@ragnatech.se |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Niklas, Thank you for the patch. On Sat, May 11, 2019 at 11:19:07AM +0200, Niklas Söderlund wrote: > To allow more than one application using libcamera simultaneously there > can be no overlap between which cameras are in use by which user. As a > camera is part of a pipeline handler and there might be shared resources > between all cameras exposed by that pipeline handler it's not enough to > to only lock access to a single camera, all cameras from that pipeline > need to be tied to the same process. > > Allow for this by locking the whole pipeline when one of its cameras > is acquired by the user. Other processes can still enumerate and list > all cameras in the system but can't acquire a camera from a locked > pipeline handler. > > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> > --- > src/libcamera/camera.cpp | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp > index cb45bafe3fb1ff85..b7c9b80de409baf3 100644 > --- a/src/libcamera/camera.cpp > +++ b/src/libcamera/camera.cpp > @@ -489,6 +489,11 @@ int Camera::acquire() You should update the documentation of the acquire() and release() methods. > if (!stateIs(CameraAvailable)) > return -EBUSY; > > + if (!pipe_->lock()) { > + LOG(Camera, Info) << "Pipeline handler in use by other process"; s/other/another/ > + return -EBUSY; > + } > + > state_ = CameraAcquired; > > return 0; > @@ -510,6 +515,8 @@ int Camera::release() > if (!stateBetween(CameraAvailable, CameraConfigured)) > return -EBUSY; > > + pipe_->unlock(); > + > state_ = CameraAvailable; > > return 0;
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index cb45bafe3fb1ff85..b7c9b80de409baf3 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -489,6 +489,11 @@ int Camera::acquire() if (!stateIs(CameraAvailable)) return -EBUSY; + if (!pipe_->lock()) { + LOG(Camera, Info) << "Pipeline handler in use by other process"; + return -EBUSY; + } + state_ = CameraAcquired; return 0; @@ -510,6 +515,8 @@ int Camera::release() if (!stateBetween(CameraAvailable, CameraConfigured)) return -EBUSY; + pipe_->unlock(); + state_ = CameraAvailable; return 0;
To allow more than one application using libcamera simultaneously there can be no overlap between which cameras are in use by which user. As a camera is part of a pipeline handler and there might be shared resources between all cameras exposed by that pipeline handler it's not enough to to only lock access to a single camera, all cameras from that pipeline need to be tied to the same process. Allow for this by locking the whole pipeline when one of its cameras is acquired by the user. Other processes can still enumerate and list all cameras in the system but can't acquire a camera from a locked pipeline handler. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> --- src/libcamera/camera.cpp | 7 +++++++ 1 file changed, 7 insertions(+)