Show a patch.

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

{
    "id": 27082,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/27082/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/27082/",
    "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": "<20260629163017.863145-4-barnabas.pocze@ideasonboard.com>",
    "date": "2026-06-29T16:29:26",
    "name": "[RFC,v1,03/54] libcamera: pipeline: Replace open-coded request cancellation",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "d59a9531c23fac5905dd0c0682a178a987a47d67",
    "submitter": {
        "id": 216,
        "url": "https://patchwork.libcamera.org/api/1.1/people/216/?format=api",
        "name": "Barnabás Pőcze",
        "email": "barnabas.pocze@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/27082/mbox/",
    "series": [
        {
            "id": 6025,
            "url": "https://patchwork.libcamera.org/api/1.1/series/6025/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=6025",
            "date": "2026-06-29T16:29:23",
            "name": "libcamera: Split requests and buffers",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/6025/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/27082/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/27082/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 7E222C3261\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 29 Jun 2026 16:30:40 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E14C865F54;\n\tMon, 29 Jun 2026 18:30:27 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5B17B65F23\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Jun 2026 18:30:21 +0200 (CEST)",
            "from pb-laptop.local (185.221.140.128.nat.pool.zt.hu\n\t[185.221.140.128])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2E5698D4;\n\tMon, 29 Jun 2026 18:29:38 +0200 (CEST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"oI1s+ba7\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1782750578;\n\tbh=V8zgSlNix/rpOp6s0TRutadeoRTwLqXW+pcnKTgSjCA=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=oI1s+ba7TszZfRMR1TxDd3Ia5HRB7G/D8l1JSNwU4ImthHJfZqa70NbQFrVGAsDzZ\n\tN0/JFSbsLsm5WyXM/PQdvEl8ivySmKJqtimNIcZowFeBL3q+LDoUNzId16a5fiYlj0\n\tNJuFMhzu3oG/p5VT5b1UomzUrkdQTFoDUARjsn3s=",
        "From": "=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "Subject": "[RFC PATCH v1 03/54] libcamera: pipeline: Replace open-coded request\n\tcancellation",
        "Date": "Mon, 29 Jun 2026 18:29:26 +0200",
        "Message-ID": "<20260629163017.863145-4-barnabas.pocze@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.54.0",
        "In-Reply-To": "<20260629163017.863145-1-barnabas.pocze@ideasonboard.com>",
        "References": "<20260629163017.863145-1-barnabas.pocze@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "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": "Use `PipelineHander::cancelRequest()` instead of manually cancelling,\ncompleting each buffer, then completing the request. This has the same\nbehaviour unless the request has no pending buffers. In which case the\nnew behaviour is to always mark the request as cancelled, while it would\nnot have been marked as cancelled previously. This affects e.g. requests\nwaiting for metadata after all buffers have completed.\n\nSigned-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/libcamera/pipeline/ipu3/ipu3.cpp             | 14 ++------------\n .../pipeline/rpi/common/pipeline_base.cpp        | 16 +---------------\n src/libcamera/pipeline/vimc/vimc.cpp             |  7 +------\n 3 files changed, 4 insertions(+), 33 deletions(-)",
    "diff": "diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex 0f3e169d3b..af1b79d708 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -790,12 +790,7 @@ void IPU3CameraData::cancelPendingRequests()\n \twhile (!pendingRequests_.empty()) {\n \t\tRequest *request = pendingRequests_.front();\n \n-\t\tfor (const auto &[stream, buffer] : request->buffers()) {\n-\t\t\tbuffer->_d()->cancel();\n-\t\t\tpipe()->completeBuffer(request, buffer);\n-\t\t}\n-\n-\t\tpipe()->completeRequest(request);\n+\t\tpipe()->cancelRequest(request);\n \t\tpendingRequests_.pop();\n \t}\n }\n@@ -1299,13 +1294,8 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)\n \n \t/* If the buffer is cancelled force a complete of the whole request. */\n \tif (buffer->metadata().status == FrameMetadata::FrameCancelled) {\n-\t\tfor (const auto &[stream, b] : request->buffers()) {\n-\t\t\tb->_d()->cancel();\n-\t\t\tpipe()->completeBuffer(request, b);\n-\t\t}\n-\n \t\tframeInfos_.remove(info);\n-\t\tpipe()->completeRequest(request);\n+\t\tpipe()->cancelRequest(request);\n \t\treturn;\n \t}\n \ndiff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\nindex 5a5acf6a16..6a6be5c820 100644\n--- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n+++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n@@ -1401,21 +1401,7 @@ void CameraData::clearIncompleteRequests()\n \t * back to the application.\n \t */\n \twhile (!requestQueue_.empty()) {\n-\t\tRequest *request = requestQueue_.front();\n-\n-\t\tfor (auto &b : request->buffers()) {\n-\t\t\tFrameBuffer *buffer = b.second;\n-\t\t\t/*\n-\t\t\t * Has the buffer already been handed back to the\n-\t\t\t * request? If not, do so now.\n-\t\t\t */\n-\t\t\tif (buffer->request()) {\n-\t\t\t\tbuffer->_d()->cancel();\n-\t\t\t\tpipe()->completeBuffer(request, buffer);\n-\t\t\t}\n-\t\t}\n-\n-\t\tpipe()->completeRequest(request);\n+\t\tpipe()->cancelRequest(requestQueue_.front());\n \t\trequestQueue_.pop();\n \t}\n }\ndiff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\nindex 01d8fb25a2..99ae60785b 100644\n--- a/src/libcamera/pipeline/vimc/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc/vimc.cpp\n@@ -605,12 +605,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer)\n \n \t/* If the buffer is cancelled force a complete of the whole request. */\n \tif (buffer->metadata().status == FrameMetadata::FrameCancelled) {\n-\t\tfor (const auto &[stream, b] : request->buffers()) {\n-\t\t\tb->_d()->cancel();\n-\t\t\tpipe->completeBuffer(request, b);\n-\t\t}\n-\n-\t\tpipe->completeRequest(request);\n+\t\tpipe->cancelRequest(request);\n \t\treturn;\n \t}\n \n",
    "prefixes": [
        "RFC",
        "v1",
        "03/54"
    ]
}