[{"id":17276,"web_url":"https://patchwork.libcamera.org/comment/17276/","msgid":"<YK5OkjheGNOIP4Ng@pendragon.ideasonboard.com>","date":"2021-05-26T13:35:14","subject":"Re: [libcamera-devel] [PATCH v2 1/1] android: CameraHalManager:\n\tCreate a static object dynamically","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Hiro,\n\nThank you for the patch.\n\nOn Wed, May 26, 2021 at 05:46:28PM +0900, Hirokazu Honda wrote:\n> Originally CameraHalManager is created in the libcamera start up\n> and destroyed in the libcamera termination. However,\n> CameraHalManager destructor can access  other static objects that\n> has been destroyed.\n> Avoid this issue by destroying CameraHalManager when tear_down() is\n> called in ChromeOS or leaking it in other platforms.\n> \n> Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> ---\n>  src/android/camera3_hal.cpp        | 13 ++++++-------\n>  src/android/camera_hal_manager.cpp |  7 +++++++\n>  src/android/camera_hal_manager.h   |  5 ++++-\n>  src/android/cros/camera3_hal.cpp   |  3 +++\n>  src/android/cros/meson.build       |  3 ++-\n>  5 files changed, 22 insertions(+), 9 deletions(-)\n> \n> diff --git a/src/android/camera3_hal.cpp b/src/android/camera3_hal.cpp\n> index 08773d33..e6d435e0 100644\n> --- a/src/android/camera3_hal.cpp\n> +++ b/src/android/camera3_hal.cpp\n> @@ -16,25 +16,23 @@ using namespace libcamera;\n>  \n>  LOG_DEFINE_CATEGORY(HAL)\n>  \n> -static CameraHalManager cameraManager;\n> -\n>  /*------------------------------------------------------------------------------\n>   * Android Camera HAL callbacks\n>   */\n>  \n>  static int hal_get_number_of_cameras()\n>  {\n> -\treturn cameraManager.numCameras();\n> +\treturn CameraHalManager::instance()->numCameras();\n>  }\n>  \n>  static int hal_get_camera_info(int id, struct camera_info *info)\n>  {\n> -\treturn cameraManager.getCameraInfo(id, info);\n> +\treturn CameraHalManager::instance()->getCameraInfo(id, info);\n>  }\n>  \n>  static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)\n>  {\n> -\tcameraManager.setCallbacks(callbacks);\n> +\tCameraHalManager::instance()->setCallbacks(callbacks);\n>  \n>  \treturn 0;\n>  }\n> @@ -62,7 +60,7 @@ static int hal_init()\n>  {\n>  \tLOG(HAL, Info) << \"Initialising Android camera HAL\";\n>  \n> -\tcameraManager.init();\n> +\tCameraHalManager::instance()->init();\n>  \n>  \treturn 0;\n>  }\n> @@ -77,7 +75,8 @@ static int hal_dev_open(const hw_module_t *module, const char *name,\n>  \tLOG(HAL, Debug) << \"Open camera \" << name;\n>  \n>  \tint id = atoi(name);\n> -\tauto [camera, ret] = cameraManager.open(id, module);\n> +\n> +\tauto [camera, ret] = CameraHalManager::instance()->open(id, module);\n>  \tif (!camera) {\n>  \t\tLOG(HAL, Error)\n>  \t\t\t<< \"Failed to open camera module '\" << id << \"'\";\n> diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp\n> index f5b86974..54087d3a 100644\n> --- a/src/android/camera_hal_manager.cpp\n> +++ b/src/android/camera_hal_manager.cpp\n> @@ -37,6 +37,13 @@ CameraHalManager::CameraHalManager()\n>  /* CameraManager calls stop() in the destructor. */\n>  CameraHalManager::~CameraHalManager() = default;\n>  \n> +/* static */\n> +CameraHalManager *CameraHalManager::instance()\n> +{\n> +\tstatic CameraHalManager *cameraHalManager = new CameraHalManager;\n> +\treturn cameraHalManager;\n\nI wonder if it would make sense to create the instance in the HAL's init\nfunction, but for now I think this is good.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nIt would be nice to have this fixed in Android itself, the fact that the\nHAL API has an .init() function but no cleanup/exit/tear_down isn't\ngreat.\n\n> +}\n> +\n>  int CameraHalManager::init()\n>  {\n>  \tcameraManager_ = std::make_unique<CameraManager>();\n> diff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h\n> index af1581da..db9354a7 100644\n> --- a/src/android/camera_hal_manager.h\n> +++ b/src/android/camera_hal_manager.h\n> @@ -26,9 +26,10 @@ class CameraDevice;\n>  class CameraHalManager\n>  {\n>  public:\n> -\tCameraHalManager();\n>  \t~CameraHalManager();\n>  \n> +\tstatic CameraHalManager *instance();\n> +\n>  \tint init();\n>  \n>  \tstd::tuple<CameraDevice *, int>\n> @@ -44,6 +45,8 @@ private:\n>  \n>  \tstatic constexpr unsigned int firstExternalCameraId_ = 1000;\n>  \n> +\tCameraHalManager();\n> +\n>  \tstatic int32_t cameraLocation(const libcamera::Camera *cam);\n>  \n>  \tvoid cameraAdded(std::shared_ptr<libcamera::Camera> cam);\n> diff --git a/src/android/cros/camera3_hal.cpp b/src/android/cros/camera3_hal.cpp\n> index 31ad36ac..d6fc1d0f 100644\n> --- a/src/android/cros/camera3_hal.cpp\n> +++ b/src/android/cros/camera3_hal.cpp\n> @@ -7,12 +7,15 @@\n>  \n>  #include <cros-camera/cros_camera_hal.h>\n>  \n> +#include \"../camera_hal_manager.h\"\n> +\n>  static void set_up(cros::CameraMojoChannelManagerToken *token)\n>  {\n>  }\n>  \n>  static void tear_down()\n>  {\n> +\tdelete CameraHalManager::instance();\n>  }\n>  \n>  cros::cros_camera_hal_t CROS_CAMERA_EXPORT CROS_CAMERA_HAL_INFO_SYM = {\n> diff --git a/src/android/cros/meson.build b/src/android/cros/meson.build\n> index 4aab0f20..13ec8f0a 100644\n> --- a/src/android/cros/meson.build\n> +++ b/src/android/cros/meson.build\n> @@ -12,6 +12,7 @@ cros_hal_info = static_library('cros_hal_info',\n>                                 cros_hal_info_sources,\n>                                 dependencies : dependency('libcros_camera'),\n>                                 c_args : '-Wno-shadow',\n> -                               include_directories : android_includes)\n> +                               include_directories : [android_includes,\n> +                                                      libcamera_includes])\n>  \n>  libcamera_objects += cros_hal_info.extract_objects('camera3_hal.cpp')","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 B5187C3203\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 May 2021 13:35:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 169F468928;\n\tWed, 26 May 2021 15:35:21 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BCF40602AE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 May 2021 15:35:19 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 319E6908;\n\tWed, 26 May 2021 15:35:19 +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=\"LF84Vrad\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1622036119;\n\tbh=aaE1VMYglqNTnRVc5sfX/j4QB6bGruKmU97FoowL7KI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=LF84Vradl/Y62wPArI/nL9/RJ3+iHenytoTprF1QkvWo+vejw/awDFKj+eIg603yx\n\tDV9ncCyknw6/5xy6JzIrPYoBW5Ij+/KoaVMgnVvPrVpZF9FAi6T+Q9h0o5SDD+kZKN\n\t7uRhY1mp9G4FlisD0yyeZRnDS4vQEvZ4GQ7hgZqA=","Date":"Wed, 26 May 2021 16:35:14 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Hirokazu Honda <hiroh@chromium.org>","Message-ID":"<YK5OkjheGNOIP4Ng@pendragon.ideasonboard.com>","References":"<20210526084628.3893266-1-hiroh@chromium.org>\n\t<20210526084628.3893266-2-hiroh@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210526084628.3893266-2-hiroh@chromium.org>","Subject":"Re: [libcamera-devel] [PATCH v2 1/1] android: CameraHalManager:\n\tCreate a static object dynamically","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>"}},{"id":17290,"web_url":"https://patchwork.libcamera.org/comment/17290/","msgid":"<20210526195757.qwa4n5aie7y7ipni@uno.localdomain>","date":"2021-05-26T19:57:57","subject":"Re: [libcamera-devel] [PATCH v2 1/1] android: CameraHalManager:\n\tCreate a static object dynamically","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Hiro,\n\nOn Wed, May 26, 2021 at 05:46:28PM +0900, Hirokazu Honda wrote:\n> Originally CameraHalManager is created in the libcamera start up\n> and destroyed in the libcamera termination. However,\n> CameraHalManager destructor can access  other static objects that\n> has been destroyed.\n> Avoid this issue by destroying CameraHalManager when tear_down() is\n> called in ChromeOS or leaking it in other platforms.\n>\n> Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n> ---\n>  src/android/camera3_hal.cpp        | 13 ++++++-------\n>  src/android/camera_hal_manager.cpp |  7 +++++++\n>  src/android/camera_hal_manager.h   |  5 ++++-\n>  src/android/cros/camera3_hal.cpp   |  3 +++\n>  src/android/cros/meson.build       |  3 ++-\n>  5 files changed, 22 insertions(+), 9 deletions(-)\n>\n> diff --git a/src/android/camera3_hal.cpp b/src/android/camera3_hal.cpp\n> index 08773d33..e6d435e0 100644\n> --- a/src/android/camera3_hal.cpp\n> +++ b/src/android/camera3_hal.cpp\n> @@ -16,25 +16,23 @@ using namespace libcamera;\n>\n>  LOG_DEFINE_CATEGORY(HAL)\n>\n> -static CameraHalManager cameraManager;\n> -\n>  /*------------------------------------------------------------------------------\n>   * Android Camera HAL callbacks\n>   */\n>\n>  static int hal_get_number_of_cameras()\n>  {\n> -\treturn cameraManager.numCameras();\n> +\treturn CameraHalManager::instance()->numCameras();\n>  }\n>\n>  static int hal_get_camera_info(int id, struct camera_info *info)\n>  {\n> -\treturn cameraManager.getCameraInfo(id, info);\n> +\treturn CameraHalManager::instance()->getCameraInfo(id, info);\n>  }\n>\n>  static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)\n>  {\n> -\tcameraManager.setCallbacks(callbacks);\n> +\tCameraHalManager::instance()->setCallbacks(callbacks);\n>\n>  \treturn 0;\n>  }\n> @@ -62,7 +60,7 @@ static int hal_init()\n>  {\n>  \tLOG(HAL, Info) << \"Initialising Android camera HAL\";\n>\n> -\tcameraManager.init();\n> +\tCameraHalManager::instance()->init();\n>\n>  \treturn 0;\n>  }\n> @@ -77,7 +75,8 @@ static int hal_dev_open(const hw_module_t *module, const char *name,\n>  \tLOG(HAL, Debug) << \"Open camera \" << name;\n>\n>  \tint id = atoi(name);\n> -\tauto [camera, ret] = cameraManager.open(id, module);\n> +\n> +\tauto [camera, ret] = CameraHalManager::instance()->open(id, module);\n>  \tif (!camera) {\n>  \t\tLOG(HAL, Error)\n>  \t\t\t<< \"Failed to open camera module '\" << id << \"'\";\n> diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp\n> index f5b86974..54087d3a 100644\n> --- a/src/android/camera_hal_manager.cpp\n> +++ b/src/android/camera_hal_manager.cpp\n> @@ -37,6 +37,13 @@ CameraHalManager::CameraHalManager()\n>  /* CameraManager calls stop() in the destructor. */\n>  CameraHalManager::~CameraHalManager() = default;\n>\n> +/* static */\n> +CameraHalManager *CameraHalManager::instance()\n> +{\n> +\tstatic CameraHalManager *cameraHalManager = new CameraHalManager;\n> +\treturn cameraHalManager;\n> +}\n> +\n>  int CameraHalManager::init()\n>  {\n>  \tcameraManager_ = std::make_unique<CameraManager>();\n> diff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h\n> index af1581da..db9354a7 100644\n> --- a/src/android/camera_hal_manager.h\n> +++ b/src/android/camera_hal_manager.h\n> @@ -26,9 +26,10 @@ class CameraDevice;\n>  class CameraHalManager\n>  {\n>  public:\n> -\tCameraHalManager();\n>  \t~CameraHalManager();\n>\n> +\tstatic CameraHalManager *instance();\n> +\n>  \tint init();\n>\n>  \tstd::tuple<CameraDevice *, int>\n> @@ -44,6 +45,8 @@ private:\n>\n>  \tstatic constexpr unsigned int firstExternalCameraId_ = 1000;\n>\n> +\tCameraHalManager();\n> +\n>  \tstatic int32_t cameraLocation(const libcamera::Camera *cam);\n>\n>  \tvoid cameraAdded(std::shared_ptr<libcamera::Camera> cam);\n> diff --git a/src/android/cros/camera3_hal.cpp b/src/android/cros/camera3_hal.cpp\n> index 31ad36ac..d6fc1d0f 100644\n> --- a/src/android/cros/camera3_hal.cpp\n> +++ b/src/android/cros/camera3_hal.cpp\n> @@ -7,12 +7,15 @@\n>\n>  #include <cros-camera/cros_camera_hal.h>\n>\n> +#include \"../camera_hal_manager.h\"\n> +\n>  static void set_up(cros::CameraMojoChannelManagerToken *token)\n>  {\n>  }\n>\n>  static void tear_down()\n>  {\n> +\tdelete CameraHalManager::instance();\n>  }\n>\n>  cros::cros_camera_hal_t CROS_CAMERA_EXPORT CROS_CAMERA_HAL_INFO_SYM = {\n> diff --git a/src/android/cros/meson.build b/src/android/cros/meson.build\n> index 4aab0f20..13ec8f0a 100644\n> --- a/src/android/cros/meson.build\n> +++ b/src/android/cros/meson.build\n> @@ -12,6 +12,7 @@ cros_hal_info = static_library('cros_hal_info',\n>                                 cros_hal_info_sources,\n>                                 dependencies : dependency('libcros_camera'),\n>                                 c_args : '-Wno-shadow',\n> -                               include_directories : android_includes)\n> +                               include_directories : [android_includes,\n> +                                                      libcamera_includes])\n>\n>  libcamera_objects += cros_hal_info.extract_objects('camera3_hal.cpp')\n> --\n> 2.31.1.818.g46aad6cb9e-goog\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 AC8FFC3203\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 May 2021 19:57:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0754468923;\n\tWed, 26 May 2021 21:57:14 +0200 (CEST)","from relay10.mail.gandi.net (relay10.mail.gandi.net\n\t[217.70.178.230])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 25E98602B1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 May 2021 21:57:12 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay10.mail.gandi.net (Postfix) with ESMTPSA id 53F40240002;\n\tWed, 26 May 2021 19:57:10 +0000 (UTC)"],"Date":"Wed, 26 May 2021 21:57:57 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Hirokazu Honda <hiroh@chromium.org>","Message-ID":"<20210526195757.qwa4n5aie7y7ipni@uno.localdomain>","References":"<20210526084628.3893266-1-hiroh@chromium.org>\n\t<20210526084628.3893266-2-hiroh@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210526084628.3893266-2-hiroh@chromium.org>","Subject":"Re: [libcamera-devel] [PATCH v2 1/1] android: CameraHalManager:\n\tCreate a static object dynamically","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>"}}]