[{"id":2406,"web_url":"https://patchwork.libcamera.org/comment/2406/","msgid":"<20190815082814.5efpbj5bhe7vsvjm@uno.localdomain>","date":"2019-08-15T08:28:14","subject":"Re: [libcamera-devel] [PATCH 03/18] libcamera: thread: Support\n\tdispatching messages to main thread","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nOn Mon, Aug 12, 2019 at 03:46:27PM +0300, Laurent Pinchart wrote:\n> Threads contain message queues and dispatch queue messages in their\ns/dispatch queue messages/dispatch messages/ ?\n\n> event loop, in Thread::exec(). This mechanism prevents the main thread\n> from dispatching messages as it doesn't run Thread::exec().\n>\n> Fix this by moving message dispatching from Thread::exec() to\n> EventDispatcher::processEvents().\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/libcamera/event_dispatcher_poll.cpp | 3 +++\n>  src/libcamera/include/thread.h          | 3 ++-\n>  src/libcamera/thread.cpp                | 4 +---\n>  3 files changed, 6 insertions(+), 4 deletions(-)\n>\n> diff --git a/src/libcamera/event_dispatcher_poll.cpp b/src/libcamera/event_dispatcher_poll.cpp\n> index 4f15f3e3269b..281f37bdbb16 100644\n> --- a/src/libcamera/event_dispatcher_poll.cpp\n> +++ b/src/libcamera/event_dispatcher_poll.cpp\n> @@ -19,6 +19,7 @@\n>  #include <libcamera/timer.h>\n>\n>  #include \"log.h\"\n> +#include \"thread.h\"\n>\n>  /**\n>   * \\file event_dispatcher_poll.h\n> @@ -143,6 +144,8 @@ void EventDispatcherPoll::processEvents()\n>  {\n>  \tint ret;\n>\n> +\tThread::current()->dispatchMessages();\n\nI understand the reason bheing this patch, but this requires all event\ndispatchers to call this in order to have messages processed.\n\nI wonder if this should not go in EventDispatcher base class operation,\nso that is executed for all subclasses automatically, and have the\nbase class operation call a pure virtual _processEvents.\n\nSomething like\n\nvoid EventDispatcher::processEvents()\n{\n\tThread::current()->dispatchMessages();\n        _processEvents();\n}\n\nTrue that right now EventDispatcher is a pure virtual base class, with\na non-pure virtual operation it might get instantiated, something I\nassume we don't want at all...\n\n> +\n>  \t/* Create the pollfd array. */\n>  \tstd::vector<struct pollfd> pollfds;\n>  \tpollfds.reserve(notifiers_.size() + 1);\n> diff --git a/src/libcamera/include/thread.h b/src/libcamera/include/thread.h\n> index acae91cb6457..630abb49534f 100644\n> --- a/src/libcamera/include/thread.h\n> +++ b/src/libcamera/include/thread.h\n> @@ -43,6 +43,8 @@ public:\n>  \tEventDispatcher *eventDispatcher();\n>  \tvoid setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher);\n>\n> +\tvoid dispatchMessages();\n> +\n>  protected:\n>  \tint exec();\n>  \tvirtual void run();\n> @@ -53,7 +55,6 @@ private:\n>\n>  \tvoid postMessage(std::unique_ptr<Message> msg, Object *receiver);\n>  \tvoid removeMessages(Object *receiver);\n> -\tvoid dispatchMessages();\n>\n>  \tfriend class Object;\n>  \tfriend class ThreadData;\n> diff --git a/src/libcamera/thread.cpp b/src/libcamera/thread.cpp\n> index 6f86e4a90a05..24422f7b7bd0 100644\n> --- a/src/libcamera/thread.cpp\n> +++ b/src/libcamera/thread.cpp\n> @@ -212,10 +212,8 @@ int Thread::exec()\n>\n>  \tlocker.unlock();\n>\n> -\twhile (!data_->exit_.load(std::memory_order_acquire)) {\n> -\t\tdispatchMessages();\n> +\twhile (!data_->exit_.load(std::memory_order_acquire))\n>  \t\tdispatcher->processEvents();\n> -\t}\n>\n>  \tlocker.lock();\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay10.mail.gandi.net (relay10.mail.gandi.net\n\t[217.70.178.230])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2230760E2C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 15 Aug 2019 10:26:53 +0200 (CEST)","from uno.localdomain\n\t(host64-130-dynamic.5-87-r.retail.telecomitalia.it [87.5.130.64])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay10.mail.gandi.net (Postfix) with ESMTPSA id 6B7C1240015;\n\tThu, 15 Aug 2019 08:26:52 +0000 (UTC)"],"Date":"Thu, 15 Aug 2019 10:28:14 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190815082814.5efpbj5bhe7vsvjm@uno.localdomain>","References":"<20190812124642.24287-1-laurent.pinchart@ideasonboard.com>\n\t<20190812124642.24287-4-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"5jy4f37sb4uttud7\"","Content-Disposition":"inline","In-Reply-To":"<20190812124642.24287-4-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH 03/18] libcamera: thread: Support\n\tdispatching messages to main thread","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Thu, 15 Aug 2019 08:26:53 -0000"}},{"id":2429,"web_url":"https://patchwork.libcamera.org/comment/2429/","msgid":"<20190817141129.GG16603@wyvern>","date":"2019-08-17T14:11:29","subject":"Re: [libcamera-devel] [PATCH 03/18] libcamera: thread: Support\n\tdispatching messages to main thread","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your work.\n\nOn 2019-08-12 15:46:27 +0300, Laurent Pinchart wrote:\n> Threads contain message queues and dispatch queue messages in their\n\ns/queue/queued/\n\n> event loop, in Thread::exec(). This mechanism prevents the main thread\n> from dispatching messages as it doesn't run Thread::exec().\n> \n> Fix this by moving message dispatching from Thread::exec() to\n> EventDispatcher::processEvents().\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  src/libcamera/event_dispatcher_poll.cpp | 3 +++\n>  src/libcamera/include/thread.h          | 3 ++-\n>  src/libcamera/thread.cpp                | 4 +---\n>  3 files changed, 6 insertions(+), 4 deletions(-)\n> \n> diff --git a/src/libcamera/event_dispatcher_poll.cpp b/src/libcamera/event_dispatcher_poll.cpp\n> index 4f15f3e3269b..281f37bdbb16 100644\n> --- a/src/libcamera/event_dispatcher_poll.cpp\n> +++ b/src/libcamera/event_dispatcher_poll.cpp\n> @@ -19,6 +19,7 @@\n>  #include <libcamera/timer.h>\n>  \n>  #include \"log.h\"\n> +#include \"thread.h\"\n>  \n>  /**\n>   * \\file event_dispatcher_poll.h\n> @@ -143,6 +144,8 @@ void EventDispatcherPoll::processEvents()\n>  {\n>  \tint ret;\n>  \n> +\tThread::current()->dispatchMessages();\n> +\n>  \t/* Create the pollfd array. */\n>  \tstd::vector<struct pollfd> pollfds;\n>  \tpollfds.reserve(notifiers_.size() + 1);\n> diff --git a/src/libcamera/include/thread.h b/src/libcamera/include/thread.h\n> index acae91cb6457..630abb49534f 100644\n> --- a/src/libcamera/include/thread.h\n> +++ b/src/libcamera/include/thread.h\n> @@ -43,6 +43,8 @@ public:\n>  \tEventDispatcher *eventDispatcher();\n>  \tvoid setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher);\n>  \n> +\tvoid dispatchMessages();\n> +\n>  protected:\n>  \tint exec();\n>  \tvirtual void run();\n> @@ -53,7 +55,6 @@ private:\n>  \n>  \tvoid postMessage(std::unique_ptr<Message> msg, Object *receiver);\n>  \tvoid removeMessages(Object *receiver);\n> -\tvoid dispatchMessages();\n>  \n>  \tfriend class Object;\n>  \tfriend class ThreadData;\n> diff --git a/src/libcamera/thread.cpp b/src/libcamera/thread.cpp\n> index 6f86e4a90a05..24422f7b7bd0 100644\n> --- a/src/libcamera/thread.cpp\n> +++ b/src/libcamera/thread.cpp\n> @@ -212,10 +212,8 @@ int Thread::exec()\n>  \n>  \tlocker.unlock();\n>  \n> -\twhile (!data_->exit_.load(std::memory_order_acquire)) {\n> -\t\tdispatchMessages();\n> +\twhile (!data_->exit_.load(std::memory_order_acquire))\n>  \t\tdispatcher->processEvents();\n> -\t}\n>  \n>  \tlocker.lock();\n>  \n> -- \n> Regards,\n> \n> Laurent Pinchart\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-ed1-x541.google.com (mail-ed1-x541.google.com\n\t[IPv6:2a00:1450:4864:20::541])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E26B9600F9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 17 Aug 2019 16:11:32 +0200 (CEST)","by mail-ed1-x541.google.com with SMTP id a21so7456640edt.11\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 17 Aug 2019 07:11:32 -0700 (PDT)","from localhost ([185.224.57.161]) by smtp.gmail.com with ESMTPSA id\n\tr3sm1663140edm.6.2019.08.17.07.11.30\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSat, 17 Aug 2019 07:11:31 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=IavJMQEWH9XhWDlaYgpnMfCN14bgLLbGwXQ9auoEIAY=;\n\tb=VkzEMVt8xStYh9hZtZ93fmQHM/KQMYi4nY39NYq4cZyERfbIz+q9aq9CwnPUaWX+zn\n\tbK9sNUuC2+wogHQyTT7su3qR4DG2FCk3uRrjE075yvZ1/gHahSYd9p8pP2OEJS6H9sOW\n\tjz81wAKCdBNEzhoHcknX9Dx+xJSe7N+XeL074IvRgaVXYuSf8fNg+TJUbSxzH+zr1J/j\n\t0kDFAVhxX69/Oonx15gf/yiKAIGaICRNT/+tXWi021LGYmrXRino31PrTp3Dt55eHvzk\n\tacJYS7ufaIdXACEbWWcyiOa9XcuZfXrkEP1TZSLnlVnprSZCH3jtyCIlxtzSeipRH2As\n\trD1g==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=IavJMQEWH9XhWDlaYgpnMfCN14bgLLbGwXQ9auoEIAY=;\n\tb=uC793iGWZhI64VWq2eoL4dnwLOkGwMKMA5HPW0LWhEsCcVQTmJM9bINDuQIvfUklMD\n\tr6vw/Vgi/vITGeYo1TVomwLoFzaj8atCp0H3lqqKwWmjgrQICBTgCSCyy9LldbRpeMhv\n\td3a4vjeqSee3+HM2RBe+r8jQqtheDAqJNnEde15AUh1AVPtNp8Cj8atKK26rHrtCzmvs\n\tIg+6ijIf/21CwAmbuChHMavNwuWd3KATnCV6FsICLaNMGIYYooHMLXRzgsYAlJBvERX4\n\tu6B/PARLn9WUaxrw60D7XkFn7c07LyZCA5DfLNO8/M9nIHCB3kQMVouIKBtx3vSrNvtY\n\t62dw==","X-Gm-Message-State":"APjAAAWfjTbdnP5L9fV4cDzz47YYXWu2WpqQjiUXOUcCjXF86HKOLy0p\n\tnKmcU7hwSmZ2A1re2cjQFg3MKQ==","X-Google-Smtp-Source":"APXvYqxlj6cFJI/K/tP15rXhy4+pSoEB9+jFD+DZ2QARZMdfEMoXG4kh30EP/jF7QGiREyrBrNBoXw==","X-Received":"by 2002:a17:906:ca56:: with SMTP id\n\tjx22mr13574424ejb.201.1566051092527; \n\tSat, 17 Aug 2019 07:11:32 -0700 (PDT)","Date":"Sat, 17 Aug 2019 16:11:29 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190817141129.GG16603@wyvern>","References":"<20190812124642.24287-1-laurent.pinchart@ideasonboard.com>\n\t<20190812124642.24287-4-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190812124642.24287-4-laurent.pinchart@ideasonboard.com>","User-Agent":"Mutt/1.12.1 (2019-06-15)","Subject":"Re: [libcamera-devel] [PATCH 03/18] libcamera: thread: Support\n\tdispatching messages to main thread","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Sat, 17 Aug 2019 14:11:33 -0000"}}]