[{"id":208,"web_url":"https://patchwork.libcamera.org/comment/208/","msgid":"<20190106113659.GE11987@bigcity.dyn.berto.se>","date":"2019-01-06T11:36:59","subject":"Re: [libcamera-devel] [PATCH 04/11] libcamera: camera_manager: Make\n\tthe class a singleton","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 patch.\n\nOn 2019-01-06 04:33:21 +0200, Laurent Pinchart wrote:\n> There can only be a single camera manager instance in the application.\n> Creating it as a singleton helps avoiding mistakes. It also allows the\n> camera manager to be used as a storage of global data, such as the\n> future event dispatcher.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  include/libcamera/camera_manager.h |  6 ++++--\n>  src/libcamera/camera_manager.cpp   | 15 +++++++++++++++\n>  test/list.cpp                      |  4 +---\n>  3 files changed, 20 insertions(+), 5 deletions(-)\n> \n> diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h\n> index 2768a5bd2384..56a3f32d8b6f 100644\n> --- a/include/libcamera/camera_manager.h\n> +++ b/include/libcamera/camera_manager.h\n> @@ -19,15 +19,17 @@ class PipelineHandler;\n>  class CameraManager\n>  {\n>  public:\n> -\tCameraManager();\n> -\n>  \tint start();\n>  \tvoid stop();\n>  \n>  \tstd::vector<std::string> list() const;\n>  \tCamera *get(const std::string &name);\n>  \n> +\tstatic CameraManager *instance();\n> +\n>  private:\n> +\tCameraManager();\n> +\n>  \tDeviceEnumerator *enumerator_;\n>  \tstd::vector<PipelineHandler *> pipes_;\n>  };\n> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> index 50a805fc665c..db2bc4b7424e 100644\n> --- a/src/libcamera/camera_manager.cpp\n> +++ b/src/libcamera/camera_manager.cpp\n> @@ -161,4 +161,19 @@ Camera *CameraManager::get(const std::string &name)\n>  \treturn nullptr;\n>  }\n>  \n> +/**\n> + * \\brief Retrieve the camera manager instance\n> + *\n> + * The CameraManager is a singleton and can't be constructed manually. This\n> + * function can instead be used to retrieve the single global instance of the\n> + * manager.\n> + *\n> + * \\return The camera manager instance\n> + */\n> +CameraManager *CameraManager::instance()\n> +{\n> +\tstatic CameraManager manager;\n> +\treturn &manager;\n> +}\n> +\n>  } /* namespace libcamera */\n> diff --git a/test/list.cpp b/test/list.cpp\n> index 39b8a41d1fef..49610c697c63 100644\n> --- a/test/list.cpp\n> +++ b/test/list.cpp\n> @@ -19,7 +19,7 @@ class ListTest : public Test\n>  protected:\n>  \tint init()\n>  \t{\n> -\t\tcm = new CameraManager();\n> +\t\tcm = CameraManager::instance();\n>  \t\tif (!cm)\n>  \t\t\treturn -ENOMEM;\n>  \n> @@ -43,8 +43,6 @@ protected:\n>  \tvoid cleanup()\n>  \t{\n>  \t\tcm->stop();\n> -\n> -\t\tdelete cm;\n>  \t}\n>  \n>  private:\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-lf1-x141.google.com (mail-lf1-x141.google.com\n\t[IPv6:2a00:1450:4864:20::141])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1687160B2C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun,  6 Jan 2019 12:37:01 +0100 (CET)","by mail-lf1-x141.google.com with SMTP id u18so28226635lff.10\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 06 Jan 2019 03:37:01 -0800 (PST)","from localhost (89-233-230-99.cust.bredband2.com. [89.233.230.99])\n\tby smtp.gmail.com with ESMTPSA id\n\tj197sm12217507lfe.24.2019.01.06.03.36.59\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tSun, 06 Jan 2019 03:36:59 -0800 (PST)"],"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=nFgIWZK6Bn/c3RJZ8EM97rQR+xNHImu8iqUEctKvouM=;\n\tb=N05OFSDSyIXCYZ6MbmZnl/C7UbnlNZEgT1A4EmCVj0Q+FqkLI2hkvzhH22JkodbIrB\n\twj5yKndmwwwVOCuXlYLgrgjLAEgWjnhsaOsNIWvvPw7HvjCrhCWFHvQG6wOOdItrtJsE\n\tnXCwwKLsB8cKDTCIy9EXiAmNKTKd+5feMK6L5RpFFBZhHHt+mg5MXo4++KxV0rHxtHyY\n\tguOjuG3YAmbvfFmzgvqyFGB6krELTG13875/zDzwZ50sJSEzU/jqGLG7qxfUaIwPHDyI\n\tX6KR2vLOau8wlSkO9p5SOEwVX3aD1OBLzGMX8anAqIOSN+37BDDZHoe82w8ZzyCWFjW0\n\t4Dcg==","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=nFgIWZK6Bn/c3RJZ8EM97rQR+xNHImu8iqUEctKvouM=;\n\tb=EVoJoQs4YBD7lUzxyi9d/39QsE6rK+5BHpOyjVFICc7A3lkZBScDzHrce3y9aT51JT\n\tTy5WbJZN8FT79jg4F5IrzCdvHzYmY84q9goTrquQ6HI1UBwDjH7GfHxOunfdceDeOFaT\n\tF0Z8z+X3lqGF8eMUPPHRmcfMIsgWylUbtIzbMZ2J3GxTCIO/YH6jr+bzK/yLVB4RLHvU\n\t7C4lROzVel6YSyBXyydI+QkQZ6yEiWnIMepj2qEMGffpPgf19q7OaJDHEJUFOEQVJSFb\n\tG7+Rx59AyV1RGRU9bDs5PW/Daolfl3QHoXDj8JWfcwnXxAT6mb5Z7aNdElf/KUjglHws\n\tpteQ==","X-Gm-Message-State":"AJcUukchc8COBH4IfyRotqicLGbUEK9nwNWLJ+8uIEFV774dU6XYqS5E\n\tG92shHHWAsoIGC6arzEa7zz8hazBejo=","X-Google-Smtp-Source":"ALg8bN7B2c8oBK40zuWeI4KtwpAsaQoNTZm18QTV8cnqOB1u+Eta1t8M0rLbI7AQNtYD27Tq6DaOMQ==","X-Received":"by 2002:ac2:4116:: with SMTP id b22mr2917561lfi.19.1546774620283;\n\tSun, 06 Jan 2019 03:37:00 -0800 (PST)","Date":"Sun, 6 Jan 2019 12:36:59 +0100","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":"<20190106113659.GE11987@bigcity.dyn.berto.se>","References":"<20190106023328.10989-1-laurent.pinchart@ideasonboard.com>\n\t<20190106023328.10989-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":"<20190106023328.10989-4-laurent.pinchart@ideasonboard.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 04/11] libcamera: camera_manager: Make\n\tthe class a singleton","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":"Sun, 06 Jan 2019 11:37:01 -0000"}},{"id":219,"web_url":"https://patchwork.libcamera.org/comment/219/","msgid":"<20190107103421.uweoyb4usqfe5ggt@uno.localdomain>","date":"2019-01-07T10:34:21","subject":"Re: [libcamera-devel] [PATCH 04/11] libcamera: camera_manager: Make\n\tthe class a singleton","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nOn Sun, Jan 06, 2019 at 04:33:21AM +0200, Laurent Pinchart wrote:\n> There can only be a single camera manager instance in the application.\n> Creating it as a singleton helps avoiding mistakes. It also allows the\n> camera manager to be used as a storage of global data, such as the\n> future event dispatcher.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  include/libcamera/camera_manager.h |  6 ++++--\n>  src/libcamera/camera_manager.cpp   | 15 +++++++++++++++\n>  test/list.cpp                      |  4 +---\n>  3 files changed, 20 insertions(+), 5 deletions(-)\n>\n> diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h\n> index 2768a5bd2384..56a3f32d8b6f 100644\n> --- a/include/libcamera/camera_manager.h\n> +++ b/include/libcamera/camera_manager.h\n> @@ -19,15 +19,17 @@ class PipelineHandler;\n>  class CameraManager\n>  {\n>  public:\n> -\tCameraManager();\n> -\n>  \tint start();\n>  \tvoid stop();\n>\n>  \tstd::vector<std::string> list() const;\n>  \tCamera *get(const std::string &name);\n>\n> +\tstatic CameraManager *instance();\n> +\n>  private:\n> +\tCameraManager();\n> +\n>  \tDeviceEnumerator *enumerator_;\n>  \tstd::vector<PipelineHandler *> pipes_;\n>  };\n> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> index 50a805fc665c..db2bc4b7424e 100644\n> --- a/src/libcamera/camera_manager.cpp\n> +++ b/src/libcamera/camera_manager.cpp\n> @@ -161,4 +161,19 @@ Camera *CameraManager::get(const std::string &name)\n>  \treturn nullptr;\n>  }\n>\n> +/**\n> + * \\brief Retrieve the camera manager instance\n> + *\n> + * The CameraManager is a singleton and can't be constructed manually. This\n> + * function can instead be used to retrieve the single global instance of the\n\nnit: s/can/shall\n\nApart from this minor thing, one other thing I wonder about is copy\nconstructors, should we set them to \"= delete\" ?\n\nWith this clarified:\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n\n> + * manager.\n> + *\n> + * \\return The camera manager instance\n> + */\n> +CameraManager *CameraManager::instance()\n> +{\n> +\tstatic CameraManager manager;\n> +\treturn &manager;\n> +}\n> +\n>  } /* namespace libcamera */\n> diff --git a/test/list.cpp b/test/list.cpp\n> index 39b8a41d1fef..49610c697c63 100644\n> --- a/test/list.cpp\n> +++ b/test/list.cpp\n> @@ -19,7 +19,7 @@ class ListTest : public Test\n>  protected:\n>  \tint init()\n>  \t{\n> -\t\tcm = new CameraManager();\n> +\t\tcm = CameraManager::instance();\n>  \t\tif (!cm)\n>  \t\t\treturn -ENOMEM;\n>\n> @@ -43,8 +43,6 @@ protected:\n>  \tvoid cleanup()\n>  \t{\n>  \t\tcm->stop();\n> -\n> -\t\tdelete cm;\n>  \t}\n>\n>  private:\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 relay9-d.mail.gandi.net (relay9-d.mail.gandi.net\n\t[217.70.183.199])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id ACF3F60B0B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  7 Jan 2019 11:34:16 +0100 (CET)","from uno.localdomain (2-224-242-101.ip172.fastwebnet.it\n\t[2.224.242.101]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 405BFFF806;\n\tMon,  7 Jan 2019 10:34:16 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","Date":"Mon, 7 Jan 2019 11:34:21 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190107103421.uweoyb4usqfe5ggt@uno.localdomain>","References":"<20190106023328.10989-1-laurent.pinchart@ideasonboard.com>\n\t<20190106023328.10989-4-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"amwy53rk65lldlyq\"","Content-Disposition":"inline","In-Reply-To":"<20190106023328.10989-4-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH 04/11] libcamera: camera_manager: Make\n\tthe class a singleton","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":"Mon, 07 Jan 2019 10:34:16 -0000"}},{"id":221,"web_url":"https://patchwork.libcamera.org/comment/221/","msgid":"<3592211.hHo2JYOdQa@avalon>","date":"2019-01-07T11:29:27","subject":"Re: [libcamera-devel] [PATCH 04/11] libcamera: camera_manager: Make\n\tthe class a singleton","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Monday, 7 January 2019 12:34:21 EET Jacopo Mondi wrote:\n> On Sun, Jan 06, 2019 at 04:33:21AM +0200, Laurent Pinchart wrote:\n> > There can only be a single camera manager instance in the application.\n> > Creating it as a singleton helps avoiding mistakes. It also allows the\n> > camera manager to be used as a storage of global data, such as the\n> > future event dispatcher.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> > \n> >  include/libcamera/camera_manager.h |  6 ++++--\n> >  src/libcamera/camera_manager.cpp   | 15 +++++++++++++++\n> >  test/list.cpp                      |  4 +---\n> >  3 files changed, 20 insertions(+), 5 deletions(-)\n> > \n> > diff --git a/include/libcamera/camera_manager.h\n> > b/include/libcamera/camera_manager.h index 2768a5bd2384..56a3f32d8b6f\n> > 100644\n> > --- a/include/libcamera/camera_manager.h\n> > +++ b/include/libcamera/camera_manager.h\n> > @@ -19,15 +19,17 @@ class PipelineHandler;\n> >  class CameraManager\n> >  {\n> >  public:\n> > -\tCameraManager();\n> > -\n> >  \tint start();\n> >  \tvoid stop();\n> >  \t\n> >  \tstd::vector<std::string> list() const;\n> >  \tCamera *get(const std::string &name);\n> > \n> > +\tstatic CameraManager *instance();\n> > +\n> >  private:\n> > +\tCameraManager();\n> > +\n> >  \tDeviceEnumerator *enumerator_;\n> >  \tstd::vector<PipelineHandler *> pipes_;\n> >  \n> >  };\n> > diff --git a/src/libcamera/camera_manager.cpp\n> > b/src/libcamera/camera_manager.cpp index 50a805fc665c..db2bc4b7424e\n> > 100644\n> > --- a/src/libcamera/camera_manager.cpp\n> > +++ b/src/libcamera/camera_manager.cpp\n> > @@ -161,4 +161,19 @@ Camera *CameraManager::get(const std::string &name)\n> >  \treturn nullptr;\n> >  }\n> > \n> > +/**\n> > + * \\brief Retrieve the camera manager instance\n> > + *\n> > + * The CameraManager is a singleton and can't be constructed manually.\n> > This + * function can instead be used to retrieve the single global\n> > instance of the\n> \n> nit: s/can/shall\n\nFixed.\n\n> Apart from this minor thing, one other thing I wonder about is copy\n> constructors, should we set them to \"= delete\" ?\n\nYes, and the operator= too. Fixed.\n\n> With this clarified:\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThank you.\n\n> > + * manager.\n> > + *\n> > + * \\return The camera manager instance\n> > + */\n> > +CameraManager *CameraManager::instance()\n> > +{\n> > +\tstatic CameraManager manager;\n> > +\treturn &manager;\n> > +}\n> > +\n> > \n> >  } /* namespace libcamera */\n> > \n> > diff --git a/test/list.cpp b/test/list.cpp\n> > index 39b8a41d1fef..49610c697c63 100644\n> > --- a/test/list.cpp\n> > +++ b/test/list.cpp\n> > @@ -19,7 +19,7 @@ class ListTest : public Test\n> >  protected:\n> >  \tint init()\n> >  \t{\n> > -\t\tcm = new CameraManager();\n> > +\t\tcm = CameraManager::instance();\n> >  \t\tif (!cm)\n> >  \t\t\treturn -ENOMEM;\n> > \n> > @@ -43,8 +43,6 @@ protected:\n> >  \tvoid cleanup()\n> >  \t{\n> >  \t\tcm->stop();\n> > -\n> > -\t\tdelete cm;\n> >  \t}\n> >  \n> >  private:","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2A559600CC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  7 Jan 2019 12:28:21 +0100 (CET)","from avalon.localnet (dfj612ybrt5fhg77mgycy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:2e86:4862:ef6a:2804])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 68CC653E;\n\tMon,  7 Jan 2019 12:28:20 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1546860500;\n\tbh=9MEiD97IqKaUbjmxb/GEyiDWNmCBA+VTwnx6QG8AnB4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=jqeA+lSpcT2wB5ZaCQkbk3DFc3nRLdSz48jxYKKioL+eywSiZMpByRpV0p6NighTI\n\thSOEPoZXwRbWZAthVT5Kyban6cZDaAmnAluFACx0REYXVS7MpHxqKireTR53c9zbBX\n\tYL44kh3MDLW4wxW/Draek2f1/AUxY527tlUBlxkk=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Date":"Mon, 07 Jan 2019 13:29:27 +0200","Message-ID":"<3592211.hHo2JYOdQa@avalon>","Organization":"Ideas on Board Oy","In-Reply-To":"<20190107103421.uweoyb4usqfe5ggt@uno.localdomain>","References":"<20190106023328.10989-1-laurent.pinchart@ideasonboard.com>\n\t<20190106023328.10989-4-laurent.pinchart@ideasonboard.com>\n\t<20190107103421.uweoyb4usqfe5ggt@uno.localdomain>","MIME-Version":"1.0","Content-Transfer-Encoding":"7Bit","Content-Type":"text/plain; charset=\"us-ascii\"","Subject":"Re: [libcamera-devel] [PATCH 04/11] libcamera: camera_manager: Make\n\tthe class a singleton","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":"Mon, 07 Jan 2019 11:28:21 -0000"}}]