Show a patch.

GET /api/patches/12357/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 12357,
    "url": "https://patchwork.libcamera.org/api/patches/12357/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/12357/",
    "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": "<20210521154227.60186-7-jacopo@jmondi.org>",
    "date": "2021-05-21T15:42:25",
    "name": "[libcamera-devel,v3,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": null,
    "mbox": "https://patchwork.libcamera.org/patch/12357/mbox/",
    "series": [
        {
            "id": 2045,
            "url": "https://patchwork.libcamera.org/api/series/2045/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2045",
            "date": "2021-05-21T15:42:19",
            "name": "Implement flush() camera operation",
            "version": 3,
            "mbox": "https://patchwork.libcamera.org/series/2045/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/12357/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/12357/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 E535EC3201\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 21 May 2021 15:41:54 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5FD9F6892D;\n\tFri, 21 May 2021 17:41:54 +0200 (CEST)",
            "from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net\n\t[217.70.183.201])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 859DB68921\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 21 May 2021 17:41:51 +0200 (CEST)",
            "(Authenticated sender: jacopo@jmondi.org)\n\tby relay8-d.mail.gandi.net (Postfix) with ESMTPSA id ABBF31BF212;\n\tFri, 21 May 2021 15:41:50 +0000 (UTC)"
        ],
        "From": "Jacopo Mondi <jacopo@jmondi.org>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Fri, 21 May 2021 17:42:25 +0200",
        "Message-Id": "<20210521154227.60186-7-jacopo@jmondi.org>",
        "X-Mailer": "git-send-email 2.31.1",
        "In-Reply-To": "<20210521154227.60186-1-jacopo@jmondi.org>",
        "References": "<20210521154227.60186-1-jacopo@jmondi.org>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v3 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>",
        "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>\nReviewed-by: Hirokazu Honda <hiroh@chromium.org>\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 fceae96a8b7c..6645c019410e 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@@ -1844,17 +1845,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 995b423c6deb..6fe5454c6535 100644\n--- a/src/android/camera_device.h\n+++ b/src/android/camera_device.h\n@@ -119,6 +119,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",
        "v3",
        "6/8"
    ]
}