[{"id":16973,"web_url":"https://patchwork.libcamera.org/comment/16973/","msgid":"<CAO5uPHPy9E1k-_7PxFo+A8b-+qQw9zQinqUCfiHZvDwCuB7aXA@mail.gmail.com>","date":"2021-05-17T04:42:25","subject":"Re: [libcamera-devel] [PATCH v2 2/8] libcamera: request: Add\n\tRequest::cancel()","submitter":{"id":63,"url":"https://patchwork.libcamera.org/api/people/63/","name":"Hirokazu Honda","email":"hiroh@chromium.org"},"content":"Hi Jacopo, thank you for the patch.\n\nOn Thu, May 13, 2021 at 6:22 PM Jacopo Mondi <jacopo@jmondi.org> wrote:\n\n> Add a cancel() function to the Request class that allows to forcefully\n> complete the request and its associated buffers in error state.\n>\n> Only pending requests can be forcefully cancelled. Enforce that\n> by asserting the request state to be RequestPending.\n>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n>\n\nReviewed-by: Hirokazu Honda <hiroh@chromium.org>\n\n\n> ---\n>  include/libcamera/request.h |  1 +\n>  src/libcamera/request.cpp   | 30 ++++++++++++++++++++++++++++++\n>  2 files changed, 31 insertions(+)\n>\n> diff --git a/include/libcamera/request.h b/include/libcamera/request.h\n> index 4cf5ff3f7d3b..5596901ddd8e 100644\n> --- a/include/libcamera/request.h\n> +++ b/include/libcamera/request.h\n> @@ -65,6 +65,7 @@ private:\n>         friend class PipelineHandler;\n>\n>         void complete();\n> +       void cancel();\n>\n>         bool completeBuffer(FrameBuffer *buffer);\n>\n> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\n> index ce2dd7b17f10..fc5e25199112 100644\n> --- a/src/libcamera/request.cpp\n> +++ b/src/libcamera/request.cpp\n> @@ -292,6 +292,36 @@ void Request::complete()\n>         LIBCAMERA_TRACEPOINT(request_complete, this);\n>  }\n>\n> +/**\n> + * \\brief Cancel a queued request\n> + *\n> + * Mark the request and its associated buffers as cancelled and complete\n> it.\n> + *\n> + * Set the status of each buffer in the request to the frame cancelled\n> state and\n> + * remove them from the pending buffer queue before completing the\n> request with\n> + * error.\n> + */\n> +void Request::cancel()\n> +{\n> +       LIBCAMERA_TRACEPOINT(request_cancel, this);\n> +\n> +       ASSERT(status_ == RequestPending);\n> +\n> +       /*\n> +        * We can't simply loop and call completeBuffer() as erase()\n> invalidates\n> +        * pointers and iterators, so we have to manually cancel the\n> buffer and\n> +        * erase it from the pending buffers list.\n> +        */\n> +       for (auto buffer = pending_.begin(); buffer != pending_.end();) {\n> +               (*buffer)->cancel();\n> +               (*buffer)->setRequest(nullptr);\n> +               buffer = pending_.erase(buffer);\n> +       }\n> +\n> +       cancelled_ = true;\n> +       complete();\n> +}\n> +\n>  /**\n>   * \\brief Complete a buffer for the request\n>   * \\param[in] buffer The buffer that has completed\n> --\n> 2.31.1\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel\n>","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 E4793C31FC\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 17 May 2021 04:42:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 67E416891E;\n\tMon, 17 May 2021 06:42:39 +0200 (CEST)","from mail-ed1-x529.google.com (mail-ed1-x529.google.com\n\t[IPv6:2a00:1450:4864:20::529])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7743B602B1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 May 2021 06:42:38 +0200 (CEST)","by mail-ed1-x529.google.com with SMTP id l7so5240003edb.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 16 May 2021 21:42:38 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"h0Zv8HFT\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=RAnQDgKZ/Jus6zqM9UmMj85b5Noy8STDMUwQfMhWgEM=;\n\tb=h0Zv8HFTPw+y4XPRUh2ecyo+//OobfuEIswi4W31fus/qms5xGfiIGkNYD16zpERnV\n\ttA7CYGfwFKDY7ZP1lyYFLV8A40LTHLRE8i3Hn66ttkfryiYy4owwKAuJ9FwAcz7DCjdm\n\t9iAoF906DW5FWSrpdLDqqjbBnRyq6H/9j+lB8=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=RAnQDgKZ/Jus6zqM9UmMj85b5Noy8STDMUwQfMhWgEM=;\n\tb=ndCKyTLWU4vTwjPoqjV39PM/SXGrU6YOzmXkown1ifoQKBRQnGG9cDjOtZTtiobDsC\n\tNE+/gpcYV38jC/RlcJi05yCVyC+or/GjDDz43ZNxBUltnKNfI2gzVdUhjqQwdfFG3bs8\n\tA83sHXCHMh2vYLk+NCOw0igUgKSP/OlJq7sXC3OJbfKALAOQo+LHxoVCGyjyrTdSbalt\n\tR6JeuDrhATqr8tl3lQAy2iXIxWpVbJhL1xcckx6gbMVLeJR40+tTa1MrRNXBiyDkqpaW\n\tPpkM0aZq3yrLrTgW9c1e+K1mt7E08Uwbo/9/264qxc5Y5IPRrrp/5eK+gk3U3JK+JmGf\n\tfmPQ==","X-Gm-Message-State":"AOAM533Sihf6I/6wrGxnSHtPkqws9ZpvcANABBAynHo3QuuFkHZ6z/o8\n\tGF8hTNzKCUvUtd/cSdQonMIoKulNF/LyHpzwIQhNmw==","X-Google-Smtp-Source":"ABdhPJySsggn0q+mCY1ZkayvmyYVVAOMUVznugsOZfxgPufoDXtwWhX0c/6pfdmfOJQ2EmxXMsLjgqqxMKLqzEKEa8U=","X-Received":"by 2002:a50:8e44:: with SMTP id 4mr69474647edx.244.1621226558032;\n\tSun, 16 May 2021 21:42:38 -0700 (PDT)","MIME-Version":"1.0","References":"<20210513092246.42847-1-jacopo@jmondi.org>\n\t<20210513092246.42847-3-jacopo@jmondi.org>","In-Reply-To":"<20210513092246.42847-3-jacopo@jmondi.org>","From":"Hirokazu Honda <hiroh@chromium.org>","Date":"Mon, 17 May 2021 13:42:25 +0900","Message-ID":"<CAO5uPHPy9E1k-_7PxFo+A8b-+qQw9zQinqUCfiHZvDwCuB7aXA@mail.gmail.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Content-Type":"multipart/alternative; boundary=\"00000000000017a01b05c27f395e\"","Subject":"Re: [libcamera-devel] [PATCH v2 2/8] libcamera: request: Add\n\tRequest::cancel()","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":16990,"web_url":"https://patchwork.libcamera.org/comment/16990/","msgid":"<8209d9f2-d078-a49b-a4b4-c5aaf0d01ed0@ideasonboard.com>","date":"2021-05-17T11:53:54","subject":"Re: [libcamera-devel] [PATCH v2 2/8] libcamera: request: Add\n\tRequest::cancel()","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn 13/05/2021 10:22, Jacopo Mondi wrote:\n> Add a cancel() function to the Request class that allows to forcefully\n> complete the request and its associated buffers in error state.\n> \n> Only pending requests can be forcefully cancelled. Enforce that\n> by asserting the request state to be RequestPending.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  include/libcamera/request.h |  1 +\n>  src/libcamera/request.cpp   | 30 ++++++++++++++++++++++++++++++\n>  2 files changed, 31 insertions(+)\n> \n> diff --git a/include/libcamera/request.h b/include/libcamera/request.h\n> index 4cf5ff3f7d3b..5596901ddd8e 100644\n> --- a/include/libcamera/request.h\n> +++ b/include/libcamera/request.h\n> @@ -65,6 +65,7 @@ private:\n>  \tfriend class PipelineHandler;\n>  \n>  \tvoid complete();\n> +\tvoid cancel();\n>  \n>  \tbool completeBuffer(FrameBuffer *buffer);\n>  \n> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\n> index ce2dd7b17f10..fc5e25199112 100644\n> --- a/src/libcamera/request.cpp\n> +++ b/src/libcamera/request.cpp\n> @@ -292,6 +292,36 @@ void Request::complete()\n>  \tLIBCAMERA_TRACEPOINT(request_complete, this);\n>  }\n>  \n> +/**\n> + * \\brief Cancel a queued request\n> + *\n> + * Mark the request and its associated buffers as cancelled and complete it.\n> + *\n> + * Set the status of each buffer in the request to the frame cancelled state and\n> + * remove them from the pending buffer queue before completing the request with\n> + * error.\n> + */\n> +void Request::cancel()\n> +{\n> +\tLIBCAMERA_TRACEPOINT(request_cancel, this);\n\nHave you checked that this is sufficient?\n\nDoesn't this require an addition in\n   include/libcamera/internal/tracepoints/request.tp\n\n\n> +\n> +\tASSERT(status_ == RequestPending);\n> +\n> +\t/*\n> +\t * We can't simply loop and call completeBuffer() as erase() invalidates\n> +\t * pointers and iterators, so we have to manually cancel the buffer and\n> +\t * erase it from the pending buffers list.\n> +\t */\n> +\tfor (auto buffer = pending_.begin(); buffer != pending_.end();) {\n> +\t\t(*buffer)->cancel();\n\nDo buffers need to notify a completion event if they're cancelled? I\ndon't think they do - but I'm curious if there is a use case to be\nnotified in a buffer event handler of a buffer being cancelled...\n\n\n\n> +\t\t(*buffer)->setRequest(nullptr);\n\nEven if the buffer is cancelled, it's still associated with this request\nisn't it?\n\nDoes it need to be set to null?\n\n\n> +\t\tbuffer = pending_.erase(buffer);\n> +\t}\n> +\n> +\tcancelled_ = true;\n> +\tcomplete();\n> +}\n> +\n>  /**\n>   * \\brief Complete a buffer for the request\n>   * \\param[in] buffer The buffer that has completed\n>","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 4D47AC31FB\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 17 May 2021 11:53:59 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8733A68918;\n\tMon, 17 May 2021 13:53:58 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9CF80602C6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 May 2021 13:53:57 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C89B688F;\n\tMon, 17 May 2021 13:53:56 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"R31/KdsL\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1621252437;\n\tbh=lyD+DOStTXaM29WYKRHvttam2hi9Mb6r+QsLcIdRkC4=;\n\th=Reply-To:To:References:From:Subject:Date:In-Reply-To:From;\n\tb=R31/KdsLByNhzTYi07rmDph4KLZYiYbpmZFQcjn1bHL5yz8uYA1NKo8taCjOjHXIM\n\tx0GzMN535mbA9N6D4lSUjn36iZkV1VvJqsWrg+y8TUETPnmKSLCNaIEonSXxZ3S2Id\n\tgYYZnmkSSlrij2txwszGg1gYME2PVU0DmX/IrVLM=","To":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","References":"<20210513092246.42847-1-jacopo@jmondi.org>\n\t<20210513092246.42847-3-jacopo@jmondi.org>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Organization":"Ideas on Board","Message-ID":"<8209d9f2-d078-a49b-a4b4-c5aaf0d01ed0@ideasonboard.com>","Date":"Mon, 17 May 2021 12:53:54 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.7.1","MIME-Version":"1.0","In-Reply-To":"<20210513092246.42847-3-jacopo@jmondi.org>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH v2 2/8] libcamera: request: Add\n\tRequest::cancel()","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>","Reply-To":"kieran.bingham@ideasonboard.com","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17039,"web_url":"https://patchwork.libcamera.org/comment/17039/","msgid":"<20210520073609.jx4gzxcfoujikonl@uno.localdomain>","date":"2021-05-20T07:36:09","subject":"Re: [libcamera-devel] [PATCH v2 2/8] libcamera: request: Add\n\tRequest::cancel()","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Kieran,\n\nOn Mon, May 17, 2021 at 12:53:54PM +0100, Kieran Bingham wrote:\n> Hi Jacopo,\n>\n> On 13/05/2021 10:22, Jacopo Mondi wrote:\n> > Add a cancel() function to the Request class that allows to forcefully\n> > complete the request and its associated buffers in error state.\n> >\n> > Only pending requests can be forcefully cancelled. Enforce that\n> > by asserting the request state to be RequestPending.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  include/libcamera/request.h |  1 +\n> >  src/libcamera/request.cpp   | 30 ++++++++++++++++++++++++++++++\n> >  2 files changed, 31 insertions(+)\n> >\n> > diff --git a/include/libcamera/request.h b/include/libcamera/request.h\n> > index 4cf5ff3f7d3b..5596901ddd8e 100644\n> > --- a/include/libcamera/request.h\n> > +++ b/include/libcamera/request.h\n> > @@ -65,6 +65,7 @@ private:\n> >  \tfriend class PipelineHandler;\n> >\n> >  \tvoid complete();\n> > +\tvoid cancel();\n> >\n> >  \tbool completeBuffer(FrameBuffer *buffer);\n> >\n> > diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\n> > index ce2dd7b17f10..fc5e25199112 100644\n> > --- a/src/libcamera/request.cpp\n> > +++ b/src/libcamera/request.cpp\n> > @@ -292,6 +292,36 @@ void Request::complete()\n> >  \tLIBCAMERA_TRACEPOINT(request_complete, this);\n> >  }\n> >\n> > +/**\n> > + * \\brief Cancel a queued request\n> > + *\n> > + * Mark the request and its associated buffers as cancelled and complete it.\n> > + *\n> > + * Set the status of each buffer in the request to the frame cancelled state and\n> > + * remove them from the pending buffer queue before completing the request with\n> > + * error.\n> > + */\n> > +void Request::cancel()\n> > +{\n> > +\tLIBCAMERA_TRACEPOINT(request_cancel, this);\n>\n> Have you checked that this is sufficient?\n>\n> Doesn't this require an addition in\n>    include/libcamera/internal/tracepoints/request.tp\n\nAH! I had no idea...\n\nIt would be nice to be able to catch this automatically, thanks for\nspotting!\n\n>\n>\n> > +\n> > +\tASSERT(status_ == RequestPending);\n> > +\n> > +\t/*\n> > +\t * We can't simply loop and call completeBuffer() as erase() invalidates\n> > +\t * pointers and iterators, so we have to manually cancel the buffer and\n> > +\t * erase it from the pending buffers list.\n> > +\t */\n> > +\tfor (auto buffer = pending_.begin(); buffer != pending_.end();) {\n> > +\t\t(*buffer)->cancel();\n>\n> Do buffers need to notify a completion event if they're cancelled? I\n> don't think they do - but I'm curious if there is a use case to be\n> notified in a buffer event handler of a buffer being cancelled...\n\nWe discussed buffer completion in relation to cancel here\nhttps://patchwork.libcamera.org/patch/12243/\n\nAlthough my position at the time was that buffers should be completed\nby the caller of Request::cancel() as they know better and for some\nuse cases it is better to let the caller handle that. However it is\nalso true that we're iterating on the pending_ buffers, so my argument\non partial request completion is defintely moot....\n\nHiro suggested to emit buffer completion in Request::cancel() would\nyou be in favour of that as well ? I'm not too at ease in emitting a\nsignal on the camera from the Request class though.\n\n>\n>\n>\n> > +\t\t(*buffer)->setRequest(nullptr);\n>\n> Even if the buffer is cancelled, it's still associated with this request\n> isn't it?\n>\n> Does it need to be set to null?\n\nNope, especially if the completion signal is emitted later. The\nhandler would receive a buffer with no Request set, which is\ndangerous.\n\nI'll change this function to\n\n        for (buf : pending_) {\n                buf->cancel();\n                /* Is this a layer violation ? */\n                camera->bufferCompleted.emit(this, buf);\n                buf = pending_.erase(buffer);\n        }\n\n        cancelled_ = true;\n        complete();\n\nWhat do you think ?\n\n>\n>\n> > +\t\tbuffer = pending_.erase(buffer);\n> > +\t}\n> > +\n> > +\tcancelled_ = true;\n> > +\tcomplete();\n> > +}\n> > +\n> >  /**\n> >   * \\brief Complete a buffer for the request\n> >   * \\param[in] buffer The buffer that has completed\n> >\n>\n> --\n> Regards\n> --\n> Kieran","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 C4804C31FB\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 20 May 2021 07:35:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DC4486891E;\n\tThu, 20 May 2021 09:35:25 +0200 (CEST)","from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[217.70.178.232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6CC9E68919\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 20 May 2021 09:35:24 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay12.mail.gandi.net (Postfix) with ESMTPSA id 8CA2E200008;\n\tThu, 20 May 2021 07:35:23 +0000 (UTC)"],"Date":"Thu, 20 May 2021 09:36:09 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20210520073609.jx4gzxcfoujikonl@uno.localdomain>","References":"<20210513092246.42847-1-jacopo@jmondi.org>\n\t<20210513092246.42847-3-jacopo@jmondi.org>\n\t<8209d9f2-d078-a49b-a4b4-c5aaf0d01ed0@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<8209d9f2-d078-a49b-a4b4-c5aaf0d01ed0@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 2/8] libcamera: request: Add\n\tRequest::cancel()","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>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]