Patch Detail
Show a patch.
GET /api/patches/12268/?format=api
{ "id": 12268, "url": "https://patchwork.libcamera.org/api/patches/12268/?format=api", "web_url": "https://patchwork.libcamera.org/patch/12268/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/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": "<20210513092246.42847-7-jacopo@jmondi.org>", "date": "2021-05-13T09:22:44", "name": "[libcamera-devel,v2,6/8] android: Guard access to the camera state", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "b97bc15bfdcbd63d966355fd2e8f3e43044ba13e", "submitter": { "id": 3, "url": "https://patchwork.libcamera.org/api/people/3/?format=api", "name": "Jacopo Mondi", "email": "jacopo@jmondi.org" }, "delegate": { "id": 15, "url": "https://patchwork.libcamera.org/api/users/15/?format=api", "username": "jmondi", "first_name": "Jacopo", "last_name": "Mondi", "email": "jacopo@jmondi.org" }, "mbox": "https://patchwork.libcamera.org/patch/12268/mbox/", "series": [ { "id": 2025, "url": "https://patchwork.libcamera.org/api/series/2025/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2025", "date": "2021-05-13T09:22:38", "name": "Implement flush() camera operation", "version": 2, "mbox": "https://patchwork.libcamera.org/series/2025/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/12268/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/12268/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 81C47C31EF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 13 May 2021 09:22:15 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4426A6892E;\n\tThu, 13 May 2021 11:22:15 +0200 (CEST)", "from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net\n\t[217.70.183.193])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 547C26891A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 13 May 2021 11:22:11 +0200 (CEST)", "from uno.LocalDomain (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay1-d.mail.gandi.net (Postfix) with ESMTPSA id B0B92240008;\n\tThu, 13 May 2021 09:22:10 +0000 (UTC)" ], "From": "Jacopo Mondi <jacopo@jmondi.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Thu, 13 May 2021 11:22:44 +0200", "Message-Id": "<20210513092246.42847-7-jacopo@jmondi.org>", "X-Mailer": "git-send-email 2.31.1", "In-Reply-To": "<20210513092246.42847-1-jacopo@jmondi.org>", "References": "<20210513092246.42847-1-jacopo@jmondi.org>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v2 6/8] android: Guard access to the\n\tcamera state", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.29", "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>", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Guard access to the camera state and the start/stop sequences\nwith a mutex.\n\nCurrently only stop() and the first call to processCaptureRequest()\nstart and stop the camera, and they're not meant to race with each\nother. With the introduction of flush() the camera can be stopped\nconcurrently to a processCaptureRequest() call, hence access to the\ncamera state will need to be protected.\n\nPrepare for that by guarding the existing paths with a mutex.\n\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n src/android/camera_device.cpp | 23 ++++++++++++++---------\n src/android/camera_device.h | 1 +\n 2 files changed, 15 insertions(+), 9 deletions(-)", "diff": "diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex 8a4543f079eb..c6cd0b6e8be7 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -759,6 +759,7 @@ void CameraDevice::close()\n \n void CameraDevice::stop()\n {\n+\tMutexLocker cameraLock(cameraMutex_);\n \tif (state_ == CameraStopped)\n \t\treturn;\n \n@@ -1915,17 +1916,21 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n \tif (!isValidRequest(camera3Request))\n \t\treturn -EINVAL;\n \n-\t/* Start the camera if that's the first request we handle. */\n-\tif (state_ == CameraStopped) {\n-\t\tworker_.start();\n+\t{\n+\t\tMutexLocker cameraLock(cameraMutex_);\n \n-\t\tint ret = camera_->start();\n-\t\tif (ret) {\n-\t\t\tLOG(HAL, Error) << \"Failed to start camera\";\n-\t\t\treturn ret;\n-\t\t}\n+\t\t/* Start the camera if that's the first request we handle. */\n+\t\tif (state_ == CameraStopped) {\n+\t\t\tworker_.start();\n \n-\t\tstate_ = CameraRunning;\n+\t\t\tint ret = camera_->start();\n+\t\t\tif (ret) {\n+\t\t\t\tLOG(HAL, Error) << \"Failed to start camera\";\n+\t\t\t\treturn ret;\n+\t\t\t}\n+\n+\t\t\tstate_ = CameraRunning;\n+\t\t}\n \t}\n \n \t/*\ndiff --git a/src/android/camera_device.h b/src/android/camera_device.h\nindex 30b364decaab..f263fdae472a 100644\n--- a/src/android/camera_device.h\n+++ b/src/android/camera_device.h\n@@ -120,6 +120,7 @@ private:\n \n \tCameraWorker worker_;\n \n+\tlibcamera::Mutex cameraMutex_; /* Protects access to the camera state. */\n \tState state_;\n \n \tstd::shared_ptr<libcamera::Camera> camera_;\n", "prefixes": [ "libcamera-devel", "v2", "6/8" ] }