{"id":22562,"url":"https://patchwork.libcamera.org/api/patches/22562/?format=json","web_url":"https://patchwork.libcamera.org/patch/22562/","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":"<20250114182143.1773762-2-pobrn@protonmail.com>","date":"2025-01-14T18:21:51","name":"[RFC,v2,01/16] apps: common: event_loop: Take callbacks by rvalue ref","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"ca2fb90fa2522365e0202b29dd453c0aacb12eb2","submitter":{"id":133,"url":"https://patchwork.libcamera.org/api/people/133/?format=json","name":"Pőcze Barnabás","email":"pobrn@protonmail.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/22562/mbox/","series":[{"id":4951,"url":"https://patchwork.libcamera.org/api/series/4951/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4951","date":"2025-01-14T18:21:46","name":"apps: lc-compliance: Multi-stream tests","version":2,"mbox":"https://patchwork.libcamera.org/series/4951/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/22562/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/22562/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 14C95C3301\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Jan 2025 18:21:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C5A1F68543;\n\tTue, 14 Jan 2025 19:21:57 +0100 (CET)","from mail-40133.protonmail.ch (mail-40133.protonmail.ch\n\t[185.70.40.133])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 85EC1607D6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Jan 2025 19:21:56 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=protonmail.com header.i=@protonmail.com\n\theader.b=\"G3Q3044Q\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com;\n\ts=protonmail3; t=1736878916; x=1737138116;\n\tbh=NLjxsPX3DNGK0sbo8UlmfLPb+Cw+1t5rXtAnv/p/uTE=;\n\th=Date:To:From:Subject:Message-ID:In-Reply-To:References:\n\tFeedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n\tMessage-ID:BIMI-Selector:List-Unsubscribe:List-Unsubscribe-Post;\n\tb=G3Q3044QE4bAjYuWrDxkQe0BCCU4KGrfLQN1f9z/aEWBEkzj5pV9/nNAcmKD4SpAz\n\t5WszKuu80A/K0oyeUZ+YECYODsQHcziUOABHoVaBwlV+wvT8dcos7wbfrnoG4qPlMG\n\tRkZta06YkO8HS9fM939aNy1VdX5YMRErCAZSkgsbbYeKhVTWOVOmcM01lOEgOGGrD2\n\t9jCrmqpznglN3dnyJvVzsBfsyKOahAMVvx+j5gs/TntRyVv9dODyt8L9cjxwd60dR6\n\txr6/lCgTUicSPaoWtb+qgIywwoRJdHjxTSudUwA1+6E3NjKUc3ieIgjMaaf2rR+PQ6\n\tHBjuiKkUrjWwA==","Date":"Tue, 14 Jan 2025 18:21:51 +0000","To":"libcamera-devel@lists.libcamera.org","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Subject":"[RFC PATCH v2 01/16] apps: common: event_loop: Take callbacks by\n\trvalue ref","Message-ID":"<20250114182143.1773762-2-pobrn@protonmail.com>","In-Reply-To":"<20250114182143.1773762-1-pobrn@protonmail.com>","References":"<20250114182143.1773762-1-pobrn@protonmail.com>","Feedback-ID":"20568564:user:proton","X-Pm-Message-ID":"e11c87e32cb03fc8f9e9dbdb4dd0fc53c1898d08","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","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":"Using a const lvalue reference to `std::function<>` is not ideal\nbecause it forces a copy to happen. Use an rvalue reference and\n`std::move()` to avoid that.\n\nSigned-off-by: Barnabás Pőcze <pobrn@protonmail.com>\n---\n src/apps/common/event_loop.cpp | 16 ++++++++--------\n src/apps/common/event_loop.h   |  8 ++++----\n 2 files changed, 12 insertions(+), 12 deletions(-)","diff":"diff --git a/src/apps/common/event_loop.cpp b/src/apps/common/event_loop.cpp\nindex f7f9afa0c..bc8cf17ab 100644\n--- a/src/apps/common/event_loop.cpp\n+++ b/src/apps/common/event_loop.cpp\n@@ -50,20 +50,20 @@ void EventLoop::exit(int code)\n \tevent_base_loopbreak(base_);\n }\n \n-void EventLoop::callLater(const std::function<void()> &func)\n+void EventLoop::callLater(std::function<void()> &&func)\n {\n \t{\n \t\tstd::unique_lock<std::mutex> locker(lock_);\n-\t\tcalls_.push_back(func);\n+\t\tcalls_.push_back(std::move(func));\n \t}\n \n \tevent_base_once(base_, -1, EV_TIMEOUT, dispatchCallback, this, nullptr);\n }\n \n void EventLoop::addFdEvent(int fd, EventType type,\n-\t\t\t   const std::function<void()> &callback)\n+\t\t\t   std::function<void()> &&callback)\n {\n-\tstd::unique_ptr<Event> event = std::make_unique<Event>(callback);\n+\tstd::unique_ptr<Event> event = std::make_unique<Event>(std::move(callback));\n \tshort events = (type & Read ? EV_READ : 0)\n \t\t     | (type & Write ? EV_WRITE : 0)\n \t\t     | EV_PERSIST;\n@@ -85,9 +85,9 @@ void EventLoop::addFdEvent(int fd, EventType type,\n }\n \n void EventLoop::addTimerEvent(const std::chrono::microseconds period,\n-\t\t\t      const std::function<void()> &callback)\n+\t\t\t      std::function<void()> &&callback)\n {\n-\tstd::unique_ptr<Event> event = std::make_unique<Event>(callback);\n+\tstd::unique_ptr<Event> event = std::make_unique<Event>(std::move(callback));\n \tevent->event_ = event_new(base_, -1, EV_PERSIST, &EventLoop::Event::dispatch,\n \t\t\t\t  event.get());\n \tif (!event->event_) {\n@@ -131,8 +131,8 @@ void EventLoop::dispatchCall()\n \tcall();\n }\n \n-EventLoop::Event::Event(const std::function<void()> &callback)\n-\t: callback_(callback), event_(nullptr)\n+EventLoop::Event::Event(std::function<void()> &&callback)\n+\t: callback_(std::move(callback)), event_(nullptr)\n {\n }\n \ndiff --git a/src/apps/common/event_loop.h b/src/apps/common/event_loop.h\nindex ef129b9aa..d7d012c76 100644\n--- a/src/apps/common/event_loop.h\n+++ b/src/apps/common/event_loop.h\n@@ -33,18 +33,18 @@ public:\n \tint exec();\n \tvoid exit(int code = 0);\n \n-\tvoid callLater(const std::function<void()> &func);\n+\tvoid callLater(std::function<void()> &&func);\n \n \tvoid addFdEvent(int fd, EventType type,\n-\t\t\tconst std::function<void()> &handler);\n+\t\t\tstd::function<void()> &&handler);\n \n \tusing duration = std::chrono::steady_clock::duration;\n \tvoid addTimerEvent(const std::chrono::microseconds period,\n-\t\t\t   const std::function<void()> &handler);\n+\t\t\t   std::function<void()> &&handler);\n \n private:\n \tstruct Event {\n-\t\tEvent(const std::function<void()> &callback);\n+\t\tEvent(std::function<void()> &&callback);\n \t\t~Event();\n \n \t\tstatic void dispatch(int fd, short events, void *arg);\n","prefixes":["RFC","v2","01/16"]}