[{"id":29350,"web_url":"https://patchwork.libcamera.org/comment/29350/","msgid":"<5jofzicegs6f6pn5i6qh23sjawzpvpisdf6ukoawvxktmrz2rk@jygmeh54jxea>","date":"2024-04-26T13:11:48","subject":"Re: [PATCH v2] treewide: Query list of cameras just once","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Barnabás\n\nOn Thu, Apr 25, 2024 at 04:03:19PM +0000, Barnabás Pőcze wrote:\n> This is more efficient since only a single vector will be constructed,\n> and furthermore, it prevents the TOCTOU issue that might arise when\n> the list of cameras changes between the two queries.\n\nMissing signed-off-by\n\n> ---\n\nWhen sending a new version please append a changelog\n\n>  Documentation/guides/application-developer.rst | 11 ++++++-----\n>  src/apps/cam/camera_session.cpp                |  6 ++++--\n>  src/gstreamer/gstlibcamerasrc.cpp              |  5 +++--\n>  3 files changed, 13 insertions(+), 9 deletions(-)\n>\n> diff --git a/Documentation/guides/application-developer.rst b/Documentation/guides/application-developer.rst\n> index 9a9905b1..e09ddfb1 100644\n> --- a/Documentation/guides/application-developer.rst\n> +++ b/Documentation/guides/application-developer.rst\n> @@ -116,20 +116,21 @@ available.\n>\n>  .. code:: cpp\n>\n> -   if (cm->cameras().empty()) {\n> +   auto cameras = cm->cameras();\n> +   if (cameras.empty()) {\n>         std::cout << \"No cameras were identified on the system.\"\n>                   << std::endl;\n>         cm->stop();\n>         return EXIT_FAILURE;\n>     }\n>\n> -   std::string cameraId = cm->cameras()[0]->id();\n> -   camera = cm->get(cameraId);\n> +   std::string cameraId = cameras[0]->id();\n>\n>     /*\n> -    * Note that is equivalent to:\n> -    * camera = cm->cameras()[0];\n> +    * Note that `camera` may be nullptr as the camera\n> +    * might have disappeared in the meantime.\n>      */\n> +   auto camera = cm->get(cameraId);\n\nShould we then check or it is an overkill for a guide ?\n\n>\n>  Once a camera has been selected an application needs to acquire an exclusive\n>  lock to it so no other application can use it.\n> diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> index 8447f932..5afd087f 100644\n> --- a/src/apps/cam/camera_session.cpp\n> +++ b/src/apps/cam/camera_session.cpp\n> @@ -39,8 +39,10 @@ CameraSession::CameraSession(CameraManager *cm,\n>  {\n>  \tchar *endptr;\n>  \tunsigned long index = strtoul(cameraId.c_str(), &endptr, 10);\n> -\tif (*endptr == '\\0' && index > 0 && index <= cm->cameras().size())\n> -\t\tcamera_ = cm->cameras()[index - 1];\n> +\tauto cameras = cm->cameras();\n> +\n> +\tif (*endptr == '\\0' && index > 0 && index <= cameras.size())\n> +\t\tcamera_ = std::move(cameras[index - 1]);\n\nThe move() doesn't hurt, but `cameras` will get out of scope at the\nend of the function, so this is not functionally equivalent (if not\nthat the entry in `cameras` is not valid anymore after a move())\n\n>  \telse\n>  \t\tcamera_ = cm->get(cameraId);\n>\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index f015c6d2..8613d66d 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -385,13 +385,14 @@ gst_libcamera_src_open(GstLibcameraSrc *self)\n>  \t\t\treturn false;\n>  \t\t}\n>  \t} else {\n> -\t\tif (cm->cameras().empty()) {\n> +\t\tauto cameras = cm->cameras();\n> +\t\tif (cameras.empty()) {\n>  \t\t\tGST_ELEMENT_ERROR(self, RESOURCE, NOT_FOUND,\n>  \t\t\t\t\t  (\"Could not find any supported camera on this system.\"),\n>  \t\t\t\t\t  (\"libcamera::CameraMananger::cameras() is empty\"));\n>  \t\t\treturn false;\n>  \t\t}\n> -\t\tcam = cm->cameras()[0];\n> +\t\tcam = std::move(cameras[0]);\n\nSame here.\n\nWould you prefer to keep the move() ?\n\n\n>  \t}\n>\n>  \tGST_INFO_OBJECT(self, \"Using camera '%s'\", cam->id().c_str());\n>\n> base-commit: fb74bb7df66b96dbe28702155cddfc96a1b30f78\n> --\n> 2.44.0\n>\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 1958FC3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 26 Apr 2024 13:11:54 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4CB9B61A9B;\n\tFri, 26 Apr 2024 15:11:53 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B08C661A9B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 26 Apr 2024 15:11:51 +0200 (CEST)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 44676CC8;\n\tFri, 26 Apr 2024 15:10:58 +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=\"mbnT7qhg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1714137058;\n\tbh=h+5xu6IF8BPsY734uOxRhxRQVZeSanDRpCwKFPINbS8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=mbnT7qhgRzmHp1RwBs1BYfXtUz4037RsnIzB9qPnPNr2YhbXDlvl2T5d5lvP5oX95\n\to39PtkdocbH53pwRH9M9srpy7rmx5sYf1T87zeySZOiRe7h63uPp+BmZbU6IpYQcsp\n\tte5rRgpY9fd/WDAAHNsgim7r/vp/FUWb2tjBR8GA=","Date":"Fri, 26 Apr 2024 15:11:48 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2] treewide: Query list of cameras just once","Message-ID":"<5jofzicegs6f6pn5i6qh23sjawzpvpisdf6ukoawvxktmrz2rk@jygmeh54jxea>","References":"<20240425160317.326458-1-pobrn@protonmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20240425160317.326458-1-pobrn@protonmail.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":29352,"web_url":"https://patchwork.libcamera.org/comment/29352/","msgid":"<O40uMd26OkYWKEkgettsz1gCMTK_yUeurnZsGme9X-cEZXmr3UxRpdc4zdDn3FQByG9X8jfUz6uiWBiqnrX93W0SgTjqMx64vOETVzbPaGM=@protonmail.com>","date":"2024-04-26T13:58:44","subject":"Re: [PATCH v2] treewide: Query list of cameras just once","submitter":{"id":133,"url":"https://patchwork.libcamera.org/api/people/133/","name":"Pőcze Barnabás","email":"pobrn@protonmail.com"},"content":"Hi\n\n\n2024. április 26., péntek 15:11 keltezéssel, Jacopo Mondi <jacopo.mondi@ideasonboard.com> írta:\n\n> Hi Barnabás\n> \n> On Thu, Apr 25, 2024 at 04:03:19PM +0000, Barnabás Pőcze wrote:\n> > This is more efficient since only a single vector will be constructed,\n> > and furthermore, it prevents the TOCTOU issue that might arise when\n> > the list of cameras changes between the two queries.\n> \n> Missing signed-off-by\n\nOops indeed.\n\n> \n> > ---\n> \n> When sending a new version please append a changelog\n\nAck.\n\n\n> \n> >  Documentation/guides/application-developer.rst | 11 ++++++-----\n> >  src/apps/cam/camera_session.cpp                |  6 ++++--\n> >  src/gstreamer/gstlibcamerasrc.cpp              |  5 +++--\n> >  3 files changed, 13 insertions(+), 9 deletions(-)\n> >\n> > diff --git a/Documentation/guides/application-developer.rst b/Documentation/guides/application-developer.rst\n> > index 9a9905b1..e09ddfb1 100644\n> > --- a/Documentation/guides/application-developer.rst\n> > +++ b/Documentation/guides/application-developer.rst\n> > @@ -116,20 +116,21 @@ available.\n> >\n> >  .. code:: cpp\n> >\n> > -   if (cm->cameras().empty()) {\n> > +   auto cameras = cm->cameras();\n> > +   if (cameras.empty()) {\n> >         std::cout << \"No cameras were identified on the system.\"\n> >                   << std::endl;\n> >         cm->stop();\n> >         return EXIT_FAILURE;\n> >     }\n> >\n> > -   std::string cameraId = cm->cameras()[0]->id();\n> > -   camera = cm->get(cameraId);\n> > +   std::string cameraId = cameras[0]->id();\n> >\n> >     /*\n> > -    * Note that is equivalent to:\n> > -    * camera = cm->cameras()[0];\n> > +    * Note that `camera` may be nullptr as the camera\n> > +    * might have disappeared in the meantime.\n> >      */\n> > +   auto camera = cm->get(cameraId);\n> \n> Should we then check or it is an overkill for a guide ?\n\nI don't know, I don't really have an opinion about this.\n\n\n> \n> >\n> >  Once a camera has been selected an application needs to acquire an exclusive\n> >  lock to it so no other application can use it.\n> > diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> > index 8447f932..5afd087f 100644\n> > --- a/src/apps/cam/camera_session.cpp\n> > +++ b/src/apps/cam/camera_session.cpp\n> > @@ -39,8 +39,10 @@ CameraSession::CameraSession(CameraManager *cm,\n> >  {\n> >  \tchar *endptr;\n> >  \tunsigned long index = strtoul(cameraId.c_str(), &endptr, 10);\n> > -\tif (*endptr == '\\0' && index > 0 && index <= cm->cameras().size())\n> > -\t\tcamera_ = cm->cameras()[index - 1];\n> > +\tauto cameras = cm->cameras();\n> > +\n> > +\tif (*endptr == '\\0' && index > 0 && index <= cameras.size())\n> > +\t\tcamera_ = std::move(cameras[index - 1]);\n> \n> The move() doesn't hurt, but `cameras` will get out of scope at the\n> end of the function, so this is not functionally equivalent (if not\n> that the entry in `cameras` is not valid anymore after a move())\n\nCertainly, but that is not an issue as far as I can tell. I can change it to\n\n  if (auto cameras = cm->cameras(); *endptr == '\\0' && index > 0 && index <= cameras.size())\n    ...\n\nif that is preferred.\n\nOr even\n\n  if (*endptr == '\\0' && index > 0) {\n    auto cameras = cm->cameras();\n    if (index <= cameras.size())\n      camera_ = cameras[index - 1];\n  }\n  if (!camera_)\n    camera_ = cm->get(cameraId);\n\nwhich is very close to the original version in its behaviour I believe.\n\n\n> \n> >  \telse\n> >  \t\tcamera_ = cm->get(cameraId);\n> >\n> > diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> > index f015c6d2..8613d66d 100644\n> > --- a/src/gstreamer/gstlibcamerasrc.cpp\n> > +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> > @@ -385,13 +385,14 @@ gst_libcamera_src_open(GstLibcameraSrc *self)\n> >  \t\t\treturn false;\n> >  \t\t}\n> >  \t} else {\n> > -\t\tif (cm->cameras().empty()) {\n> > +\t\tauto cameras = cm->cameras();\n> > +\t\tif (cameras.empty()) {\n> >  \t\t\tGST_ELEMENT_ERROR(self, RESOURCE, NOT_FOUND,\n> >  \t\t\t\t\t  (\"Could not find any supported camera on this system.\"),\n> >  \t\t\t\t\t  (\"libcamera::CameraMananger::cameras() is empty\"));\n> >  \t\t\treturn false;\n> >  \t\t}\n> > -\t\tcam = cm->cameras()[0];\n> > +\t\tcam = std::move(cameras[0]);\n> \n> Same here.\n> \n> Would you prefer to keep the move() ?\n\nI have been planning on sending a separate commit that does some of these\nlong hanging shared pointer related optimizations, so I will remove the move()\nin the next version.\n\n\n> \n> \n> >  \t}\n> >\n> >  \tGST_INFO_OBJECT(self, \"Using camera '%s'\", cam->id().c_str());\n> >\n> > base-commit: fb74bb7df66b96dbe28702155cddfc96a1b30f78\n> > --\n> > 2.44.0\n> >\n> >\n> \n\n\nRegards,\nBarnabás Pőcze","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 37850C3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 26 Apr 2024 13:58:52 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 24072633ED;\n\tFri, 26 Apr 2024 15:58:51 +0200 (CEST)","from mail-40134.protonmail.ch (mail-40134.protonmail.ch\n\t[185.70.40.134])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C243E61A9B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 26 Apr 2024 15:58:48 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=protonmail.com header.i=@protonmail.com\n\theader.b=\"Jyd+cvbN\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com;\n\ts=protonmail3; t=1714139928; x=1714399128;\n\tbh=ZwMTYpLt+J7EB8TRJBKDxlo7CD9vPekJglh+ZUMtUlc=;\n\th=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References:\n\tFeedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n\tMessage-ID:BIMI-Selector;\n\tb=Jyd+cvbNzMfyRrw5CeOqsDR1f9sFZYvfQXf/jB5hQuuEJj3eRJAZTx25NshmjQcj7\n\t81u1dyCV12+Pw4p/2FiazUf9Y2d+gMO+r2dl2VS/xrKX1k+v7hnukYhHb1kk11tKdl\n\tYHttqrqku0f4oWNCBXxdtrozKHet2rsCFKnT1QbTOzNnVyFHr5tUrbuvl2VW5yYpBr\n\tP3ucWS5VDxqDlX41t4YGVsxhXDfxiKXftd95cBPpjjVBUhCIvk/isP+xNkO4eXn642\n\tSchojZ5c6m5DRnWM2gOFpcN0vD7JafFQlZV1BvQ8OXn7KKldDvBAbr+hGqJhkq2HKP\n\tJDBlAWcc7pMJg==","Date":"Fri, 26 Apr 2024 13:58:44 +0000","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2] treewide: Query list of cameras just once","Message-ID":"<O40uMd26OkYWKEkgettsz1gCMTK_yUeurnZsGme9X-cEZXmr3UxRpdc4zdDn3FQByG9X8jfUz6uiWBiqnrX93W0SgTjqMx64vOETVzbPaGM=@protonmail.com>","In-Reply-To":"<5jofzicegs6f6pn5i6qh23sjawzpvpisdf6ukoawvxktmrz2rk@jygmeh54jxea>","References":"<20240425160317.326458-1-pobrn@protonmail.com>\n\t<5jofzicegs6f6pn5i6qh23sjawzpvpisdf6ukoawvxktmrz2rk@jygmeh54jxea>","Feedback-ID":"20568564:user:proton","X-Pm-Message-ID":"973b32c051f998ba24b7a90449f18c8cfddc4cb5","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>"}},{"id":29353,"web_url":"https://patchwork.libcamera.org/comment/29353/","msgid":"<ckohzzipljmnh6hkhlzrlm22tq4fqfhiorrvx5wh4fjaxa7w3a@324yrr6xejsv>","date":"2024-04-26T14:07:30","subject":"Re: [PATCH v2] treewide: Query list of cameras just once","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Barnabás\n\nOn Fri, Apr 26, 2024 at 01:58:44PM +0000, Barnabás Pőcze wrote:\n> Hi\n>\n>\n> 2024. április 26., péntek 15:11 keltezéssel, Jacopo Mondi <jacopo.mondi@ideasonboard.com> írta:\n>\n> > Hi Barnabás\n> >\n> > On Thu, Apr 25, 2024 at 04:03:19PM +0000, Barnabás Pőcze wrote:\n> > > This is more efficient since only a single vector will be constructed,\n> > > and furthermore, it prevents the TOCTOU issue that might arise when\n> > > the list of cameras changes between the two queries.\n> >\n> > Missing signed-off-by\n>\n> Oops indeed.\n>\n> >\n> > > ---\n> >\n> > When sending a new version please append a changelog\n>\n> Ack.\n>\n>\n> >\n> > >  Documentation/guides/application-developer.rst | 11 ++++++-----\n> > >  src/apps/cam/camera_session.cpp                |  6 ++++--\n> > >  src/gstreamer/gstlibcamerasrc.cpp              |  5 +++--\n> > >  3 files changed, 13 insertions(+), 9 deletions(-)\n> > >\n> > > diff --git a/Documentation/guides/application-developer.rst b/Documentation/guides/application-developer.rst\n> > > index 9a9905b1..e09ddfb1 100644\n> > > --- a/Documentation/guides/application-developer.rst\n> > > +++ b/Documentation/guides/application-developer.rst\n> > > @@ -116,20 +116,21 @@ available.\n> > >\n> > >  .. code:: cpp\n> > >\n> > > -   if (cm->cameras().empty()) {\n> > > +   auto cameras = cm->cameras();\n> > > +   if (cameras.empty()) {\n> > >         std::cout << \"No cameras were identified on the system.\"\n> > >                   << std::endl;\n> > >         cm->stop();\n> > >         return EXIT_FAILURE;\n> > >     }\n> > >\n> > > -   std::string cameraId = cm->cameras()[0]->id();\n> > > -   camera = cm->get(cameraId);\n> > > +   std::string cameraId = cameras[0]->id();\n> > >\n> > >     /*\n> > > -    * Note that is equivalent to:\n> > > -    * camera = cm->cameras()[0];\n> > > +    * Note that `camera` may be nullptr as the camera\n> > > +    * might have disappeared in the meantime.\n> > >      */\n> > > +   auto camera = cm->get(cameraId);\n> >\n> > Should we then check or it is an overkill for a guide ?\n>\n> I don't know, I don't really have an opinion about this.\n>\n>\n> >\n> > >\n> > >  Once a camera has been selected an application needs to acquire an exclusive\n> > >  lock to it so no other application can use it.\n> > > diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp\n> > > index 8447f932..5afd087f 100644\n> > > --- a/src/apps/cam/camera_session.cpp\n> > > +++ b/src/apps/cam/camera_session.cpp\n> > > @@ -39,8 +39,10 @@ CameraSession::CameraSession(CameraManager *cm,\n> > >  {\n> > >  \tchar *endptr;\n> > >  \tunsigned long index = strtoul(cameraId.c_str(), &endptr, 10);\n> > > -\tif (*endptr == '\\0' && index > 0 && index <= cm->cameras().size())\n> > > -\t\tcamera_ = cm->cameras()[index - 1];\n> > > +\tauto cameras = cm->cameras();\n> > > +\n> > > +\tif (*endptr == '\\0' && index > 0 && index <= cameras.size())\n> > > +\t\tcamera_ = std::move(cameras[index - 1]);\n> >\n> > The move() doesn't hurt, but `cameras` will get out of scope at the\n> > end of the function, so this is not functionally equivalent (if not\n> > that the entry in `cameras` is not valid anymore after a move())\n>\n> Certainly, but that is not an issue as far as I can tell. I can change it to\n\nSorry, that clearly was a typo\n\nI meant \"\n\n The move() doesn't hurt, but `cameras` will get out of scope at the\n end of the function, so this is functionally equivalent (if not\n that the entry in `cameras` is not valid anymore after a move())\n\n\nWhat I meant was: move() doesn't really hurt (as long as we don't\naccess camera[index - 1] later) but as cameras will get out of scope,\nat the end of the function the usage count camera_ is the same with\nor without move()\n\n>\n>   if (auto cameras = cm->cameras(); *endptr == '\\0' && index > 0 && index <= cameras.size())\n>     ...\n>\n> if that is preferred.\n>\n> Or even\n>\n>   if (*endptr == '\\0' && index > 0) {\n>     auto cameras = cm->cameras();\n>     if (index <= cameras.size())\n>       camera_ = cameras[index - 1];\n>   }\n>   if (!camera_)\n>     camera_ = cm->get(cameraId);\n>\n> which is very close to the original version in its behaviour I believe.\n>\n>\n> >\n> > >  \telse\n> > >  \t\tcamera_ = cm->get(cameraId);\n> > >\n> > > diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> > > index f015c6d2..8613d66d 100644\n> > > --- a/src/gstreamer/gstlibcamerasrc.cpp\n> > > +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> > > @@ -385,13 +385,14 @@ gst_libcamera_src_open(GstLibcameraSrc *self)\n> > >  \t\t\treturn false;\n> > >  \t\t}\n> > >  \t} else {\n> > > -\t\tif (cm->cameras().empty()) {\n> > > +\t\tauto cameras = cm->cameras();\n> > > +\t\tif (cameras.empty()) {\n> > >  \t\t\tGST_ELEMENT_ERROR(self, RESOURCE, NOT_FOUND,\n> > >  \t\t\t\t\t  (\"Could not find any supported camera on this system.\"),\n> > >  \t\t\t\t\t  (\"libcamera::CameraMananger::cameras() is empty\"));\n> > >  \t\t\treturn false;\n> > >  \t\t}\n> > > -\t\tcam = cm->cameras()[0];\n> > > +\t\tcam = std::move(cameras[0]);\n> >\n> > Same here.\n> >\n> > Would you prefer to keep the move() ?\n>\n> I have been planning on sending a separate commit that does some of these\n> long hanging shared pointer related optimizations, so I will remove the move()\n> in the next version.\n\nThat's fine with me! Sorry for the mis-understanding\n>\n>\n> >\n> >\n> > >  \t}\n> > >\n> > >  \tGST_INFO_OBJECT(self, \"Using camera '%s'\", cam->id().c_str());\n> > >\n> > > base-commit: fb74bb7df66b96dbe28702155cddfc96a1b30f78\n> > > --\n> > > 2.44.0\n> > >\n> > >\n> >\n>\n>\n> Regards,\n> Barnabás Pőcze","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 BE77ABE08B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 26 Apr 2024 14:07:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8FC6963416;\n\tFri, 26 Apr 2024 16:07:35 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AA0F961A9B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 26 Apr 2024 16:07:33 +0200 (CEST)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 23B18D7E;\n\tFri, 26 Apr 2024 16:06:40 +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=\"JH9kpSjq\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1714140400;\n\tbh=lwEJnDQAoG+elG4fJk5JiykslAn9/r5hEtcl0OiXvOU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=JH9kpSjqNWtmTdhiUwhYR2FlaRMeixtw4XWkT6nUuwMuWYYCAM97JnX5Bgv6K9Wba\n\tpA3jlol3syl0cHtizvUie1KkaAhW47r6lmqOCImYUcq6tObZTGVrS8RuhlOOn/+qM+\n\tKq3rX57CXeggZ49WZwbynvqjEK3qbaXySJXpzLVM=","Date":"Fri, 26 Apr 2024 16:07:30 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <pobrn@protonmail.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>, \n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2] treewide: Query list of cameras just once","Message-ID":"<ckohzzipljmnh6hkhlzrlm22tq4fqfhiorrvx5wh4fjaxa7w3a@324yrr6xejsv>","References":"<20240425160317.326458-1-pobrn@protonmail.com>\n\t<5jofzicegs6f6pn5i6qh23sjawzpvpisdf6ukoawvxktmrz2rk@jygmeh54jxea>\n\t<O40uMd26OkYWKEkgettsz1gCMTK_yUeurnZsGme9X-cEZXmr3UxRpdc4zdDn3FQByG9X8jfUz6uiWBiqnrX93W0SgTjqMx64vOETVzbPaGM=@protonmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<O40uMd26OkYWKEkgettsz1gCMTK_yUeurnZsGme9X-cEZXmr3UxRpdc4zdDn3FQByG9X8jfUz6uiWBiqnrX93W0SgTjqMx64vOETVzbPaGM=@protonmail.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>"}}]