{"id":11069,"url":"https://patchwork.libcamera.org/api/1.1/patches/11069/?format=json","web_url":"https://patchwork.libcamera.org/patch/11069/","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":"<20210130001915.489703-2-niklas.soderlund@ragnatech.se>","date":"2021-01-30T00:19:14","name":"[libcamera-devel,v3,1/2] cam: event_loop: Stop queuing calls when the event loop are exiting","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"91f1201ef325defc3be1794c5424897cec91c715","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/1.1/people/5/?format=json","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/11069/mbox/","series":[{"id":1629,"url":"https://patchwork.libcamera.org/api/1.1/series/1629/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1629","date":"2021-01-30T00:19:13","name":"cam: Fix races in event loop and long request processing times","version":3,"mbox":"https://patchwork.libcamera.org/series/1629/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/11069/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/11069/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 C6F55BD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 30 Jan 2021 00:19:40 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 595E6683CA;\n\tSat, 30 Jan 2021 01:19:39 +0100 (CET)","from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net\n\t[195.74.38.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3E503683BE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 30 Jan 2021 01:19:38 +0100 (CET)","from bismarck.berto.se (p4fca2458.dip0.t-ipconnect.de\n\t[79.202.36.88])\n\tby bin-vsp-out-03.atm.binero.net (Halon) with ESMTPA\n\tid d5c197ae-6290-11eb-b73f-0050569116f7;\n\tSat, 30 Jan 2021 01:19:37 +0100 (CET)"],"X-Halon-ID":"d5c197ae-6290-11eb-b73f-0050569116f7","Authorized-sender":"niklas.soderlund@fsdn.se","From":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","To":"libcamera-devel@lists.libcamera.org","Date":"Sat, 30 Jan 2021 01:19:14 +0100","Message-Id":"<20210130001915.489703-2-niklas.soderlund@ragnatech.se>","X-Mailer":"git-send-email 2.30.0","In-Reply-To":"<20210130001915.489703-1-niklas.soderlund@ragnatech.se>","References":"<20210130001915.489703-1-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Subject":"[libcamera-devel] [PATCH v3 1/2] cam: event_loop: Stop queuing\n\tcalls when the event loop are exiting","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>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Terminating the event loop with EventLoop::exit() does not grantee that\nit will terminate. If the event loops 'call later' queue can be kept\nnon-empty by continuously queuing new calls using EventLoop::callLater()\neither from a different thread or from callbacks in the loop itself\nEventLoop::dispatchCalls() will never complete and the loop will run\nforever.\n\nSolve this by only executing the already queued calls each invocation of\ndispatchCalls() and only enter the idle loop if dispatchCalls() had no\ncalls to dispatch.\n\nReported-by: Sebastian Fricke <sebastian.fricke@posteo.net>\nFixes: f49e93338b6309a6 (\"cam: event_loop: Add deferred calls support\")\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n src/cam/event_loop.cpp | 21 +++++++++------------\n src/cam/event_loop.h   |  2 +-\n 2 files changed, 10 insertions(+), 13 deletions(-)","diff":"diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp\nindex 94c5d1d362455f33..f0b1ecbb6244c40a 100644\n--- a/src/cam/event_loop.cpp\n+++ b/src/cam/event_loop.cpp\n@@ -41,8 +41,8 @@ int EventLoop::exec()\n \texit_.store(false, std::memory_order_release);\n \n \twhile (!exit_.load(std::memory_order_acquire)) {\n-\t\tdispatchCalls();\n-\t\tevent_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);\n+\t\tif (!dispatchCalls())\n+\t\t\tevent_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);\n \t}\n \n \treturn exitCode_;\n@@ -70,17 +70,14 @@ void EventLoop::callLater(const std::function<void()> &func)\n \tinterrupt();\n }\n \n-void EventLoop::dispatchCalls()\n+bool EventLoop::dispatchCalls()\n {\n-\tstd::unique_lock<std::mutex> locker(lock_);\n+\tlock_.lock();\n+\tstd::list<std::function<void()>> calls = std::move(calls_);\n+\tlock_.unlock();\n \n-\tfor (auto iter = calls_.begin(); iter != calls_.end(); ) {\n-\t\tstd::function<void()> call = std::move(*iter);\n-\n-\t\titer = calls_.erase(iter);\n-\n-\t\tlocker.unlock();\n+\tfor (std::function<void()> call : calls)\n \t\tcall();\n-\t\tlocker.lock();\n-\t}\n+\n+\treturn !calls.empty();\n }\ndiff --git a/src/cam/event_loop.h b/src/cam/event_loop.h\nindex 408073c50594d09d..b2535f7bdd96742a 100644\n--- a/src/cam/event_loop.h\n+++ b/src/cam/event_loop.h\n@@ -38,7 +38,7 @@ private:\n \tstd::mutex lock_;\n \n \tvoid interrupt();\n-\tvoid dispatchCalls();\n+\tbool dispatchCalls();\n };\n \n #endif /* __CAM_EVENT_LOOP_H__ */\n","prefixes":["libcamera-devel","v3","1/2"]}