[{"id":33464,"web_url":"https://patchwork.libcamera.org/comment/33464/","msgid":"<20250224210118.GK6778@pendragon.ideasonboard.com>","date":"2025-02-24T21:01:18","subject":"Re: [PATCH v2 5/5] libcamera: software_isp: Modify dispatching\n\tmessages on stop","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Milan,\n\nThank you for the patch.\n\nOn Mon, Feb 24, 2025 at 07:52:35PM +0100, Milan Zamazal wrote:\n> There may be pending messages in SoftwareIsp message queue when\n> SoftwareIsp stops.  The call to IPAProxySoft::stop() will dispatch them\n> before SoftwareIsp::stop() finishes.  But this is dependent on\n> IPAProxySoft::stop() implementation and we can do better to ensure they\n> are dispatched before SoftwareIsp::stop() finishes.\n> \n> Let's introduce new `receiver' argument to Thread::dispatchMessages(),\n> limiting dispatching the messages to the given receiver.  Now we can\n> flush the messages destined for the SoftwareIsp instance explicitly.\n> And the IPA proxy can flush just the messages destined for itself.\n> Other messages of the given thread remain queued and will be handled\n> elsewhere as appropriate.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  include/libcamera/base/thread.h                   |  3 ++-\n>  src/libcamera/base/thread.cpp                     | 15 ++++++++++-----\n\nCould you split this to a separate patch ? Something like\n\nlibcamera: base: thread: Support dispatching messages for specific receiver\n\nThe 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\n>  src/libcamera/software_isp/software_isp.cpp       |  3 +++\n>  .../libcamera_templates/proxy_functions.tmpl      |  2 +-\n\nprxoy_function.tmpl can then also be split to a separate patch.\n\nutils: ipc: Only dispatch messages for proxy when stopping thread\n\nWhen stopping the proxy thread, all messages of InvokeMessage type\nposted to the pipeline handler thread are dispatched, to ensure that all\nsignals emitted from the proxy thread and queued for delivery to the\nproxy are delivered synchronously. This unnecessarily delivers queued\nsignals for other objects in the pipeline handler thread, possibly\ndelaying processing of higher priority events.\n\nImprove the implementation by limiting synchronous delivery to messages\nposted for the proxy.\n\n\n\nIn case a problem is found later with the IPA proxy, it will be easier\nto revert this specific change.\n\n>  4 files changed, 16 insertions(+), 7 deletions(-)\n> \n> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h\n> index 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();\n> diff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp\n> index 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\nLet's expand this paragraph to explain the receiver parameter:\n\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\nI think you can then shorten the documentation of the parameter:\n\n * \\param[in] receiver The receiver whose messages to dispatch\n\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}\n> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n> index 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\nI'd add a blank line here.\n\nI think you can also swap the two lines. Dispatching the messages first\nwill ensure that any queued signal that indicates completion of a buffer\nwill be delivered to the pipeline handler. That may push one extra frame\nto the application. On the other hand, as we're stopping the ISP, maybe\nthe application doesn't care.\n\nI wonder if we could actually drop the running_ variable now. By\ndispatching all pending messages, we ensure that no new calls to the IPA\nwill be made from signal handlers invoked from the dispatchMessages()\ncall from within ipa_->stop().\n\n>  \tipa_->stop();\n>  \n>  \tfor (auto buffer : queuedOutputBuffers_) {\n> diff --git a/utils/codegen/ipc/generators/libcamera_templates/proxy_functions.tmpl b/utils/codegen/ipc/generators/libcamera_templates/proxy_functions.tmpl\n> index 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 -%}","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 6E23BC32A9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 24 Feb 2025 21:01:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 70E1A6870B;\n\tMon, 24 Feb 2025 22:01:37 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C2B64686FF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 24 Feb 2025 22:01:36 +0100 (CET)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id AFF6E581;\n\tMon, 24 Feb 2025 22:00:09 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"LWsOlxcF\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1740430809;\n\tbh=9sbtyb0wz07ANGuBYqWt2lKVtwmX4fO22v7hJToDUPw=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=LWsOlxcFhafPrT7+m8HZ5w0HDrtnpFBpkGRU0mfazurcarNryo+Hhc4jVe/NdifLG\n\tapuC7o9RS1nfn/D185h49cZ8fwDXagTTIlgJH/THsayXR3Vx99wO4OLR8rvPDjZ2Kv\n\tuSmNsr+ZNSPUbDdFEp3h/RDtKh7l034utacQISRw=","Date":"Mon, 24 Feb 2025 23:01:18 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH v2 5/5] libcamera: software_isp: Modify dispatching\n\tmessages on stop","Message-ID":"<20250224210118.GK6778@pendragon.ideasonboard.com>","References":"<20250224185235.43381-1-mzamazal@redhat.com>\n\t<20250224185235.43381-6-mzamazal@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20250224185235.43381-6-mzamazal@redhat.com>","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>"}},{"id":33475,"web_url":"https://patchwork.libcamera.org/comment/33475/","msgid":"<85ldtuf5jg.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-02-25T14:44:03","subject":"Re: [PATCH v2 5/5] libcamera: software_isp: Modify dispatching\n\tmessages on stop","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Laurent,\n\nthank you for review.\n\nLaurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n\n> Hi Milan,\n>\n> Thank you for the patch.\n>\n> On Mon, Feb 24, 2025 at 07:52:35PM +0100, Milan Zamazal wrote:\n>> There may be pending messages in SoftwareIsp message queue when\n>> SoftwareIsp stops.  The call to IPAProxySoft::stop() will dispatch them\n>> before SoftwareIsp::stop() finishes.  But this is dependent on\n>> IPAProxySoft::stop() implementation and we can do better to ensure they\n>> are dispatched before SoftwareIsp::stop() finishes.\n>> \n>> Let's introduce new `receiver' argument to Thread::dispatchMessages(),\n>> limiting dispatching the messages to the given receiver.  Now we can\n>> flush the messages destined for the SoftwareIsp instance explicitly.\n>> And the IPA proxy can flush just the messages destined for itself.\n>> Other messages of the given thread remain queued and will be handled\n>> elsewhere as appropriate.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  include/libcamera/base/thread.h                   |  3 ++-\n>>  src/libcamera/base/thread.cpp                     | 15 ++++++++++-----\n>\n> Could you split this to a separate patch ? Something like\n>\n> libcamera: base: thread: Support dispatching messages for specific receiver\n>\n> The Thread::dispatchMessage() function supports filtering messages based\n> on their type. It can be useful to also dispatch only messages posted\n> for a specific receiver. Add an optional receiver argument to the\n> dispatchMessage() function to do so. When set to null (the default\n> value), the behaviour of the function is not changed.\n>\n>>  src/libcamera/software_isp/software_isp.cpp       |  3 +++\n>>  .../libcamera_templates/proxy_functions.tmpl      |  2 +-\n>\n> prxoy_function.tmpl can then also be split to a separate patch.\n>\n> utils: ipc: Only dispatch messages for proxy when stopping thread\n>\n> When stopping the proxy thread, all messages of InvokeMessage type\n> posted to the pipeline handler thread are dispatched, to ensure that all\n> signals emitted from the proxy thread and queued for delivery to the\n> proxy are delivered synchronously. This unnecessarily delivers queued\n> signals for other objects in the pipeline handler thread, possibly\n> delaying processing of higher priority events.\n>\n> Improve the implementation by limiting synchronous delivery to messages\n> posted for the proxy.\n>\n>\n>\n> In case a problem is found later with the IPA proxy, it will be easier\n> to revert this specific change.\n>\n>>  4 files changed, 16 insertions(+), 7 deletions(-)\n>> \n>> diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h\n>> index 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();\n>> diff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp\n>> index 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>\n> Let's expand this paragraph to explain the receiver parameter:\n>\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> I think you can then shorten the documentation of the parameter:\n>\n>  * \\param[in] receiver The receiver whose messages to dispatch\n>\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}\n>> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\n>> index 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>\n> I'd add a blank line here.\n>\n> I think you can also swap the two lines. Dispatching the messages first\n> will ensure that any queued signal that indicates completion of a buffer\n> will be delivered to the pipeline handler. That may push one extra frame\n> to the application. On the other hand, as we're stopping the ISP, maybe\n> the application doesn't care.\n>\n> I wonder if we could actually drop the running_ variable now. \n\nI think we can and it works for me.  I'll do it in v3.\n\n> By dispatching all pending messages, we ensure that no new calls to\n> the IPA will be made from signal handlers invoked from the\n> dispatchMessages() call from within ipa_->stop().\n>\n>>  \tipa_->stop();\n>>  \n>>  \tfor (auto buffer : queuedOutputBuffers_) {\n>> diff --git a/utils/codegen/ipc/generators/libcamera_templates/proxy_functions.tmpl b/utils/codegen/ipc/generators/libcamera_templates/proxy_functions.tmpl\n>> index 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 -%}","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 14FD4BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 25 Feb 2025 14:44:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3B29A686E8;\n\tTue, 25 Feb 2025 15:44:13 +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 70AFA61855\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Feb 2025 15:44:11 +0100 (CET)","from mail-wr1-f71.google.com (mail-wr1-f71.google.com\n\t[209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-186-_E_3vd2QM4Gra5KM8K2BVQ-1; Tue, 25 Feb 2025 09:44:08 -0500","by mail-wr1-f71.google.com with SMTP id\n\tffacd0b85a97d-38f51a3a833so2258679f8f.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Feb 2025 06:44:07 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-43ab156a183sm28323205e9.40.2025.02.25.06.44.03\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 25 Feb 2025 06:44:04 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"Gfuwn1ZJ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1740494650;\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\tin-reply-to:in-reply-to:references:references;\n\tbh=u+D5CdtOQuN6kfPttRTEEpgSj+Qxk/1ELWrfDIdjkh4=;\n\tb=Gfuwn1ZJ8xHauwLGwnSRcgRRYYETkwAeTkbkR7y+5bQbAbu4Syp9gdfo19ocaEjpAL/bo5\n\t5b3gsMpv4bz/gBKTPuhqgctMh3p26erplalK4metPgCYMdw396i4a7LgZq85fZ6JZAtyM4\n\txR4KRtgnN+jAV5L+9CzE3LbsRXjuJMk=","X-MC-Unique":"_E_3vd2QM4Gra5KM8K2BVQ-1","X-Mimecast-MFC-AGG-ID":"_E_3vd2QM4Gra5KM8K2BVQ_1740494645","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1740494645; x=1741099445;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=u+D5CdtOQuN6kfPttRTEEpgSj+Qxk/1ELWrfDIdjkh4=;\n\tb=l2Ly2bPZtvhoJ1Ci66H1t9a/hmUdJHFsoL/mJDN1RbOY2B3tGwdqyxMgv7Xiu01QRd\n\tI9ofl0MyngyIyVYOyLx4BmUiFaHYOQL3sccojyEfmts6n1c4GKCUG7JSBQgBOGzu0qK3\n\t5DwpwERz9gQS2W5WPvspPiaqyIa/6l96vHVcZA3p7CmJ3XGXwSCB1fKULPHtVNQUCTUz\n\tNVyMKC3aO390+zOVdVOdr7zZ2SxXPQGw5Tollho9Ps375kvQDw3WmSWAfGfag/kNwoC7\n\t7vEFOWTn8MhE9hpz5lnhxgep1B64hEK9hri4QoqMGfAxDgcqVzpy+q1d2HXc+rSQhTXv\n\tJ3jQ==","X-Gm-Message-State":"AOJu0YyWRFLi671dn3zehy4NMz073y1K7zDVF99/X/MtsvOdp44fU3k6\n\tcB2qPGqp8H44ic82DlcPOv+2w+ozjMTKAHtH/fZ1QlANKagf4tLK/6cM4vcPTVSDZ7ubuJK4qdf\n\tFvPOVFSk6typUyTFguKZjAQDDXQhupZcdh+EBOpNGOy/ccbDoOZHZPo3tGLiqAKSsI3fK60I=","X-Gm-Gg":"ASbGncsGHaYJsNQHT52poSeChIPtnAj8A+BX7Fhjmrjan9dHrEIU12qOZQbbWHdr7oY\n\tqTY6HyAoCi5UGk0PhffMThY9G9zvf5m6UHYaF/RANmkVEW98H+Pdt1VWhidIoC64uMB0uSScWZc\n\tAkFs+CbXzTtQ6QzpJcXy95e0RLooad/hDM3W4VqndvtjleJhwim27aDeBDdSChF04JM/xqfwSUm\n\tE88+2GlvGjiE9yI1JhVAIOh13RvAyAVvyup8/6mkwccsMemYngpMFLuC4O/Y6kaGzKbC4WOBLxg\n\tKu48M70NGgtjShxht9I1/kxCp2ivr5bxE3JSbqIzdK/nrqeIj0Rxa9Lm/qx2T7h8XIfz","X-Received":["by 2002:a5d:5f51:0:b0:38d:dffc:c133 with SMTP id\n\tffacd0b85a97d-38f70827ad7mr15956923f8f.44.1740494645201; \n\tTue, 25 Feb 2025 06:44:05 -0800 (PST)","by 2002:a5d:5f51:0:b0:38d:dffc:c133 with SMTP id\n\tffacd0b85a97d-38f70827ad7mr15956894f8f.44.1740494644807; \n\tTue, 25 Feb 2025 06:44:04 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IE3KS5xepB9FBJXWulUzWmpE7lUaO8DLofuPGHXQExms2DPyNiEKi32of+pAr8nHRe1UG9fdA==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Stanislaw Gruszka\n\t<stanislaw.gruszka@linux.intel.com>,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH v2 5/5] libcamera: software_isp: Modify dispatching\n\tmessages on stop","In-Reply-To":"<20250224210118.GK6778@pendragon.ideasonboard.com> (Laurent\n\tPinchart's message of \"Mon, 24 Feb 2025 23:01:18 +0200\")","References":"<20250224185235.43381-1-mzamazal@redhat.com>\n\t<20250224185235.43381-6-mzamazal@redhat.com>\n\t<20250224210118.GK6778@pendragon.ideasonboard.com>","Date":"Tue, 25 Feb 2025 15:44:03 +0100","Message-ID":"<85ldtuf5jg.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"fGzHfYVzFcwGcE5IPDgHQ8Kx3rlDfRo8G0qgpdMSgK4_1740494645","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]