{"id":22845,"url":"https://patchwork.libcamera.org/api/patches/22845/?format=json","web_url":"https://patchwork.libcamera.org/patch/22845/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20250224120854.19747-6-mzamazal@redhat.com>","date":"2025-02-24T12:08:54","name":"[5/5] libcamera: software_isp: Modify dispatching messages on stop","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"cfd38465bd34fcd2ea18449a570e48e04ed26b48","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/?format=json","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/22845/mbox/","series":[{"id":5015,"url":"https://patchwork.libcamera.org/api/series/5015/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5015","date":"2025-02-24T12:08:49","name":"Fix occasional software ISP assertion error on stop","version":1,"mbox":"https://patchwork.libcamera.org/series/5015/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/22845/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/22845/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 D6A81C32C2\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 24 Feb 2025 12:09:24 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 53ACC686F9;\n\tMon, 24 Feb 2025 13:09:24 +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 B0027686F4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 24 Feb 2025 13:09:22 +0100 (CET)","from mx-prod-mc-08.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-336-RqpnhuoyOBuEIe21BMOOLA-1;\n\tMon, 24 Feb 2025 07:09:18 -0500","from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.40])\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-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 6AECB1800875; Mon, 24 Feb 2025 12:09:17 +0000 (UTC)","from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.225.60])\n\tby mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 816B819560AB; Mon, 24 Feb 2025 12:09:15 +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=\"K6v5HW2C\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1740398961;\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=vommuU7mKkaVRfL0lYXIdRZQCLVVNLDOpQA66iiz7rE=;\n\tb=K6v5HW2CmRJrgG47jyrId1z3+RK6p6PT2PJBV1gMbnr9cqR4cRyQYPHcwE9kdrjYNvG1mk\n\tXq77YPSFUrR9xN0WgTXWS8CIVRF3rKMUsxsJx6puQs8/kLq34yWqFNyrNyjhjokf4i/jxZ\n\tLNlBcKVXHzbzyjVGGavMx9zB+WF1E7k=","X-MC-Unique":"RqpnhuoyOBuEIe21BMOOLA-1","X-Mimecast-MFC-AGG-ID":"RqpnhuoyOBuEIe21BMOOLA_1740398957","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 5/5] libcamera: software_isp: Modify dispatching messages on\n\tstop","Date":"Mon, 24 Feb 2025 13:08:54 +0100","Message-ID":"<20250224120854.19747-6-mzamazal@redhat.com>","In-Reply-To":"<20250224120854.19747-1-mzamazal@redhat.com>","References":"<20250224120854.19747-1-mzamazal@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.0 on 10.30.177.40","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"86FtDa__4BGjze9YI5SFsh9ajcRePAiR-iexkDtN-ec_1740398957","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                      | 14 +++++++++-----\n src/libcamera/software_isp/software_isp.cpp        |  3 +++\n .../libcamera_templates/proxy_functions.tmpl       |  2 +-\n 4 files changed, 15 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..2fde2959 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@@ -640,12 +642,14 @@ 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\tif (receiver && receiver != messageReceiver)\n+\t\t\tcontinue;\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":["5/5"]}