From patchwork Sun Apr 14 01:35:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 980 Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0DE6B60DCA for ; Sun, 14 Apr 2019 03:35:21 +0200 (CEST) X-Halon-ID: 907b0a98-5e55-11e9-8e2c-005056917f90 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA id 907b0a98-5e55-11e9-8e2c-005056917f90; Sun, 14 Apr 2019 03:35:20 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Sun, 14 Apr 2019 03:35:06 +0200 Message-Id: <20190414013506.10515-12-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190414013506.10515-1-niklas.soderlund@ragnatech.se> References: <20190414013506.10515-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC 11/11] libcamera: camera: Lock the pipeline handler in acquire() X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 14 Apr 2019 01:35:21 -0000 To allow more then 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 needs to be tied to the same process. Allow for this by locking the whole pipeline when one of it's cameras are acquired by the user. Other processes can still enumerate and list all cameras in the system but cant progress a camera in a locked pipeline handler to the Acquired state. Signed-off-by: Niklas Söderlund --- src/libcamera/camera.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index bdf14b31d8eeba9c..b3860952efa6446f 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -495,6 +495,11 @@ int Camera::acquire() if (!stateIs(CameraAvailable)) return -EBUSY; + if (!pipe_->lock()) { + LOG(Camera, Info) << "Camera in use by other process"; + return -EBUSY; + } + state_ = CameraAcquired; return 0; @@ -516,6 +521,8 @@ int Camera::release() if (!stateBetween(CameraAvailable, CameraConfigured)) return -EBUSY; + pipe_->unlock(); + state_ = CameraAvailable; return 0;