From patchwork Mon Apr 29 19:17:29 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: 1139 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B3BC060E69 for ; Mon, 29 Apr 2019 21:17:55 +0200 (CEST) X-Halon-ID: 7d73c0d9-6ab3-11e9-8e2c-005056917f90 Authorized-sender: niklas@soderlund.pp.se Received: from wyvern.station (unknown [37.182.44.227]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA id 7d73c0d9-6ab3-11e9-8e2c-005056917f90; Mon, 29 Apr 2019 21:17:55 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Mon, 29 Apr 2019 21:17:29 +0200 Message-Id: <20190429191729.29697-12-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190429191729.29697-1-niklas.soderlund@ragnatech.se> References: <20190429191729.29697-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 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: Mon, 29 Apr 2019 19:17:56 -0000 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 --- src/libcamera/camera.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index ef9e15be09ece319..95f652e5953b2016 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;