Patch Detail
Show a patch.
GET /api/1.1/patches/1216/?format=api
{ "id": 1216, "url": "https://patchwork.libcamera.org/api/1.1/patches/1216/?format=api", "web_url": "https://patchwork.libcamera.org/patch/1216/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20190517005447.27171-12-niklas.soderlund@ragnatech.se>", "date": "2019-05-17T00:54:47", "name": "[libcamera-devel,v4,11/11] libcamera: camera: Lock the pipeline handler in acquire()", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "45f483bc48cd5ec8b6413d7f40e527f1d723b73c", "submitter": { "id": 5, "url": "https://patchwork.libcamera.org/api/1.1/people/5/?format=api", "name": "Niklas Söderlund", "email": "niklas.soderlund@ragnatech.se" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/1216/mbox/", "series": [ { "id": 306, "url": "https://patchwork.libcamera.org/api/1.1/series/306/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=306", "date": "2019-05-17T00:54:36", "name": "libcamerea: Add support for exclusive access to cameras between processes", "version": 4, "mbox": "https://patchwork.libcamera.org/series/306/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/1216/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/1216/checks/", "tags": {}, "headers": { "Return-Path": "<niklas.soderlund@ragnatech.se>", "Received": [ "from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net\n\t[195.74.38.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C0D1B61869\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 17 May 2019 02:55:16 +0200 (CEST)", "from bismarck.berto.se (unknown [89.233.230.99])\n\tby bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA\n\tid 6e93dc6b-783e-11e9-8d05-005056917f90;\n\tFri, 17 May 2019 02:55:15 +0200 (CEST)" ], "X-Halon-ID": "6e93dc6b-783e-11e9-8d05-005056917f90", "Authorized-sender": "niklas@soderlund.pp.se", "From": "=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 17 May 2019 02:54:47 +0200", "Message-Id": "<20190517005447.27171-12-niklas.soderlund@ragnatech.se>", "X-Mailer": "git-send-email 2.21.0", "In-Reply-To": "<20190517005447.27171-1-niklas.soderlund@ragnatech.se>", "References": "<20190517005447.27171-1-niklas.soderlund@ragnatech.se>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=UTF-8", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v4 11/11] libcamera: camera: Lock the\n\tpipeline handler in acquire()", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.23", "Precedence": "list", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "X-List-Received-Date": "Fri, 17 May 2019 00:55:17 -0000" }, "content": "To allow more than one application using libcamera simultaneously there\ncan be no overlap between which cameras are in use by which user. As a\ncamera is part of a pipeline handler and there might be shared resources\nbetween all cameras exposed by that pipeline handler it's not enough to\nto only lock access to a single camera, all cameras from that pipeline\nneed to be tied to the same process.\n\nAllow for this by locking the whole pipeline when one of its cameras\nis acquired by the user. Other processes can still enumerate and list\nall cameras in the system but can't acquire a camera from a locked\npipeline handler.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n src/libcamera/camera.cpp | 16 ++++++++++++++--\n 1 file changed, 14 insertions(+), 2 deletions(-)", "diff": "diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex cb45bafe3fb1ff85..a83768fcde126c32 100644\n--- a/src/libcamera/camera.cpp\n+++ b/src/libcamera/camera.cpp\n@@ -470,13 +470,17 @@ void Camera::disconnect()\n * not blocking, if the device has already been acquired (by the same or another\n * process) the -EBUSY error code is returned.\n *\n+ * Acquiring a camera will limit usage of any other camera(s) provided by the\n+ * same pipeline hander to the same instance of libcamera. The limit is in\n+ * effect until all cameras from the pipeline handler are released(). Other\n+ * instances of libcamera can still list and examine the cameras but will fail\n+ * if they attempt to acquire() any of them.\n+ *\n * Once exclusive access isn't needed anymore, the device should be released\n * with a call to the release() function.\n *\n * This function affects the state of the camera, see \\ref camera_operation.\n *\n- * \\todo Implement exclusive access across processes.\n- *\n * \\return 0 on success or a negative error code otherwise\n * \\retval -ENODEV The camera has been disconnected from the system\n * \\retval -EBUSY The camera is not free and can't be acquired by the caller\n@@ -489,6 +493,12 @@ int Camera::acquire()\n \tif (!stateIs(CameraAvailable))\n \t\treturn -EBUSY;\n \n+\tif (!pipe_->lock()) {\n+\t\tLOG(Camera, Info)\n+\t\t\t<< \"Pipeline handler in use by another process\";\n+\t\treturn -EBUSY;\n+\t}\n+\n \tstate_ = CameraAcquired;\n \n \treturn 0;\n@@ -510,6 +520,8 @@ int Camera::release()\n \tif (!stateBetween(CameraAvailable, CameraConfigured))\n \t\treturn -EBUSY;\n \n+\tpipe_->unlock();\n+\n \tstate_ = CameraAvailable;\n \n \treturn 0;\n", "prefixes": [ "libcamera-devel", "v4", "11/11" ] }