Show a patch.

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

{
    "id": 22850,
    "url": "https://patchwork.libcamera.org/api/patches/22850/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/22850/",
    "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": "<20250224185235.43381-6-mzamazal@redhat.com>",
    "date": "2025-02-24T18:52:35",
    "name": "[v2,5/5] libcamera: software_isp: Modify dispatching messages on stop",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": false,
    "hash": "444a3468fd5b1d83740650882c3b9264a638de15",
    "submitter": {
        "id": 177,
        "url": "https://patchwork.libcamera.org/api/people/177/?format=api",
        "name": "Milan Zamazal",
        "email": "mzamazal@redhat.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/22850/mbox/",
    "series": [
        {
            "id": 5016,
            "url": "https://patchwork.libcamera.org/api/series/5016/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5016",
            "date": "2025-02-24T18:52:30",
            "name": "Fix occasional software ISP assertion error on stop",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/5016/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/22850/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/22850/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 831FCC32A9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 24 Feb 2025 18:53:04 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2F1D268709;\n\tMon, 24 Feb 2025 19:53:04 +0100 (CET)",
            "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0DD05686FC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 24 Feb 2025 19:53:00 +0100 (CET)",
            "from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-158-rhrrHEteN925CfgMpo6Uww-1;\n\tMon, 24 Feb 2025 13:52:58 -0500",
            "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.111])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 82D0E1800874; Mon, 24 Feb 2025 18:52:57 +0000 (UTC)",
            "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.225.60])\n\tby mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 3767E180087A; Mon, 24 Feb 2025 18:52:54 +0000 (UTC)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"FMifbrJ6\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1740423180;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=8gwNhWskfWNIRQdiLRKzt2nM9Eoyun7sJ9adzmnx2gg=;\n\tb=FMifbrJ66IQdLOG09dTU+G3j70gkrpJXYlTvM9t1P2yiumT1csZ5lHsfa9daVzGdb2h5fB\n\tJn7V83hReiWeCDdDbg7lACFtYkvadjkLxahRRWRRA4wyVQuB/B6mULWTBhzOruMLSg79nf\n\tTX/FzRCwnsrigXBSvdo7iOPvf7CbN2s=",
        "X-MC-Unique": "rhrrHEteN925CfgMpo6Uww-1",
        "X-Mimecast-MFC-AGG-ID": "rhrrHEteN925CfgMpo6Uww_1740423177",
        "From": "Milan Zamazal <mzamazal@redhat.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>,\n\tStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>",
        "Subject": "[PATCH v2 5/5] libcamera: software_isp: Modify dispatching messages\n\ton stop",
        "Date": "Mon, 24 Feb 2025 19:52:35 +0100",
        "Message-ID": "<20250224185235.43381-6-mzamazal@redhat.com>",
        "In-Reply-To": "<20250224185235.43381-1-mzamazal@redhat.com>",
        "References": "<20250224185235.43381-1-mzamazal@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-MFC-PROC-ID": "I-4xmx0Te749jezyiLX4t4uU0Nntfl1sqgFMl3WG3fw_1740423177",
        "X-Mimecast-Originator": "redhat.com",
        "Content-Transfer-Encoding": "8bit",
        "content-type": "text/plain; charset=\"US-ASCII\"; x-default=true",
        "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": "There may be pending messages in SoftwareIsp message queue when\nSoftwareIsp stops.  The call to IPAProxySoft::stop() will dispatch them\nbefore SoftwareIsp::stop() finishes.  But this is dependent on\nIPAProxySoft::stop() implementation and we can do better to ensure they\nare dispatched before SoftwareIsp::stop() finishes.\n\nLet's introduce new `receiver' argument to Thread::dispatchMessages(),\nlimiting dispatching the messages to the given receiver.  Now we can\nflush the messages destined for the SoftwareIsp instance explicitly.\nAnd the IPA proxy can flush just the messages destined for itself.\nOther messages of the given thread remain queued and will be handled\nelsewhere as appropriate.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n include/libcamera/base/thread.h                   |  3 ++-\n src/libcamera/base/thread.cpp                     | 15 ++++++++++-----\n src/libcamera/software_isp/software_isp.cpp       |  3 +++\n .../libcamera_templates/proxy_functions.tmpl      |  2 +-\n 4 files changed, 16 insertions(+), 7 deletions(-)",
    "diff": "diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h\nindex 3cbf6398..b9284c2c 100644\n--- a/include/libcamera/base/thread.h\n+++ b/include/libcamera/base/thread.h\n@@ -48,7 +48,8 @@ public:\n \n \tEventDispatcher *eventDispatcher();\n \n-\tvoid dispatchMessages(Message::Type type = Message::Type::None);\n+\tvoid dispatchMessages(Message::Type type = Message::Type::None,\n+\t\t\t      Object *receiver = nullptr);\n \n protected:\n \tint exec();\ndiff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp\nindex 02128f23..6f22f4ed 100644\n--- a/src/libcamera/base/thread.cpp\n+++ b/src/libcamera/base/thread.cpp\n@@ -603,6 +603,8 @@ void Thread::removeMessages(Object *receiver)\n /**\n  * \\brief Dispatch posted messages for this thread\n  * \\param[in] type The message type\n+ * \\param[in] receiver If not null, dispatch only messages for the given\n+ *    receiver\n  *\n  * This function immediately dispatches all the messages previously posted for\n  * this thread with postMessage() that match the message \\a type. If the \\a type\n@@ -616,7 +618,7 @@ void Thread::removeMessages(Object *receiver)\n  * same thread from an object's message handler. It guarantees delivery of\n  * messages in the order they have been posted in all cases.\n  */\n-void Thread::dispatchMessages(Message::Type type)\n+void Thread::dispatchMessages(Message::Type type, Object *receiver)\n {\n \tASSERT(data_ == ThreadData::current());\n \n@@ -633,6 +635,9 @@ void Thread::dispatchMessages(Message::Type type)\n \t\tif (type != Message::Type::None && msg->type() != type)\n \t\t\tcontinue;\n \n+\t\tif (receiver && receiver != msg->receiver_)\n+\t\t\tcontinue;\n+\n \t\t/*\n \t\t * Move the message, setting the entry in the list to null. It\n \t\t * will cause recursive calls to ignore the entry, and the erase\n@@ -640,12 +645,12 @@ void Thread::dispatchMessages(Message::Type type)\n \t\t */\n \t\tstd::unique_ptr<Message> message = std::move(msg);\n \n-\t\tObject *receiver = message->receiver_;\n-\t\tASSERT(data_ == receiver->thread()->data_);\n-\t\treceiver->pendingMessages_--;\n+\t\tObject *messageReceiver = message->receiver_;\n+\t\tASSERT(data_ == messageReceiver->thread()->data_);\n+\t\tmessageReceiver->pendingMessages_--;\n \n \t\tlocker.unlock();\n-\t\treceiver->message(message.get());\n+\t\tmessageReceiver->message(message.get());\n \t\tmessage.reset();\n \t\tlocker.lock();\n \t}\ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex 3a605ab2..8f5ee774 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -13,6 +13,8 @@\n #include <sys/types.h>\n #include <unistd.h>\n \n+#include <libcamera/base/thread.h>\n+\n #include <libcamera/controls.h>\n #include <libcamera/formats.h>\n #include <libcamera/stream.h>\n@@ -339,6 +341,7 @@ void SoftwareIsp::stop()\n \tispWorkerThread_.wait();\n \n \trunning_ = false;\n+\tThread::current()->dispatchMessages(Message::Type::InvokeMessage, this);\n \tipa_->stop();\n \n \tfor (auto buffer : queuedOutputBuffers_) {\ndiff --git a/utils/codegen/ipc/generators/libcamera_templates/proxy_functions.tmpl b/utils/codegen/ipc/generators/libcamera_templates/proxy_functions.tmpl\nindex b5797b14..25476990 100644\n--- a/utils/codegen/ipc/generators/libcamera_templates/proxy_functions.tmpl\n+++ b/utils/codegen/ipc/generators/libcamera_templates/proxy_functions.tmpl\n@@ -34,7 +34,7 @@\n \tthread_.exit();\n \tthread_.wait();\n \n-\tThread::current()->dispatchMessages(Message::Type::InvokeMessage);\n+\tThread::current()->dispatchMessages(Message::Type::InvokeMessage, this);\n \n \tstate_ = ProxyStopped;\n {%- endmacro -%}\n",
    "prefixes": [
        "v2",
        "5/5"
    ]
}