{"id":22859,"url":"https://patchwork.libcamera.org/api/1.1/patches/22859/?format=json","web_url":"https://patchwork.libcamera.org/patch/22859/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/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":"<20250225150614.20195-5-mzamazal@redhat.com>","date":"2025-02-25T15:06:10","name":"[v3,4/6] libcamera: base: thread: Support dispatching for a specific receiver","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"b40727eef45c8ba0b36fd0e62345ec6f858f5809","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/1.1/people/177/?format=json","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/22859/mbox/","series":[{"id":5019,"url":"https://patchwork.libcamera.org/api/1.1/series/5019/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5019","date":"2025-02-25T15:06:06","name":"Fix occasional software ISP assertion error on stop","version":3,"mbox":"https://patchwork.libcamera.org/series/5019/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/22859/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/22859/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 26597BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 25 Feb 2025 15:06:40 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C48456871F;\n\tTue, 25 Feb 2025 16:06:39 +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 22B2A6871F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Feb 2025 16:06:37 +0100 (CET)","from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-680-E0K2pPQxNVWl2vRoNC6d_A-1;\n\tTue, 25 Feb 2025 10:06:34 -0500","from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.93])\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-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 930B41903080; Tue, 25 Feb 2025 15:06:33 +0000 (UTC)","from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.224.119])\n\tby mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id CA35D1800357; Tue, 25 Feb 2025 15:06:31 +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=\"TvXiVs9P\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1740495996;\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=OipSodZMyJzQcC/vHPpXedrdorXiOZZNFpS0UHYjAyU=;\n\tb=TvXiVs9PH/X8bQFkGhC8sfdyoHMGL6z8d4eB2QBvDiREeKHOMvYa9LdmKurm6DHHJi7IOJ\n\t4/GIGqpSGPW+C0KhTl/E26eL1TIx8rqF6eNcxJdjlSzOn0e5ULK5Y9bDWfCxAVA4UXQZW6\n\tHV1HxRKE/D417EY5OoeqasIroweIQWw=","X-MC-Unique":"E0K2pPQxNVWl2vRoNC6d_A-1","X-Mimecast-MFC-AGG-ID":"E0K2pPQxNVWl2vRoNC6d_A_1740495993","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 v3 4/6] libcamera: base: thread: Support dispatching for a\n\tspecific receiver","Date":"Tue, 25 Feb 2025 16:06:10 +0100","Message-ID":"<20250225150614.20195-5-mzamazal@redhat.com>","In-Reply-To":"<20250225150614.20195-1-mzamazal@redhat.com>","References":"<20250225150614.20195-1-mzamazal@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.93","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"rV6XyZPOew2KUVzVlBqrAh8B0BF9rnNGDWrfHL5eCAE_1740495993","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":"The Thread::dispatchMessage() function supports filtering messages based\non their type. It can be useful to also dispatch only messages posted\nfor a specific receiver. Add an optional receiver argument to the\ndispatchMessage() function to do so. When set to null (the default\nvalue), the behaviour of the function is not changed.\n\nThis facility is actually used in followup patches.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n include/libcamera/base/thread.h |  3 ++-\n src/libcamera/base/thread.cpp   | 21 +++++++++++++--------\n 2 files changed, 15 insertions(+), 9 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 319bfda9..4de356c7 100644\n--- a/src/libcamera/base/thread.cpp\n+++ b/src/libcamera/base/thread.cpp\n@@ -604,10 +604,12 @@ 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 The receiver whose messages to dispatch\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- * is Message::Type::None, all messages are dispatched.\n+ * This function immediately dispatches all the messages of the given \\a type\n+ * previously posted to this thread for the \\a receiver with postMessage(). If\n+ * the \\a type is Message::Type::None, all messages types are dispatched. If the\n+ * \\a receiver is null, messages to all receivers are dispatched.\n  *\n  * Messages shall only be dispatched from the current thread, typically within\n  * the thread from the run() function. Calling this function outside of the\n@@ -617,7 +619,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@@ -634,6 +636,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@@ -641,12 +646,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}\n","prefixes":["v3","4/6"]}