[{"id":27359,"web_url":"https://patchwork.libcamera.org/comment/27359/","msgid":"<20230615193754.GA14547@pendragon.ideasonboard.com>","date":"2023-06-15T19:37:54","subject":"Re: [libcamera-devel] [PATCH v4 2/5] libcamera: camera_manager:\n\tMove private implementation to internal","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nThank you for the patch.\n\nOn Thu, Jun 15, 2023 at 06:26:05PM +0100, Kieran Bingham via libcamera-devel wrote:\n> The CameraManager makes use of the Extensible pattern to provide an\n> internal private implementation that is not exposed in the public API.\n> \n> Move the Private declaration to an internal header to make it available\n> from other internal components in preperation for reducing the surface\n> area of the public interface of the CameraManager.\n> \n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> Tested-by: Ashok Sidipotu <ashok.sidipotu@collabora.com>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> ---\n> \n> v4\n>  - Fix includes\n>  - Fix sort order of header in meson.build\n>  - Fix doxygen file references\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  include/libcamera/internal/camera_manager.h | 70 +++++++++++++++++++++\n>  include/libcamera/internal/meson.build      |  1 +\n>  src/libcamera/camera_manager.cpp            | 59 +++--------------\n>  3 files changed, 80 insertions(+), 50 deletions(-)\n>  create mode 100644 include/libcamera/internal/camera_manager.h\n> \n> diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h\n> new file mode 100644\n> index 000000000000..96a83bd7ef3c\n> --- /dev/null\n> +++ b/include/libcamera/internal/camera_manager.h\n> @@ -0,0 +1,70 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2023, Ideas on Board Oy.\n> + *\n> + * camera_manager.h - Camera manager private data\n> + */\n> +\n> +#pragma once\n> +\n> +#include <libcamera/camera_manager.h>\n> +\n> +#include <map>\n> +#include <memory>\n> +#include <sys/types.h>\n> +#include <vector>\n> +\n> +#include <libcamera/base/class.h>\n> +#include <libcamera/base/mutex.h>\n> +#include <libcamera/base/thread.h>\n> +#include <libcamera/base/thread_annotations.h>\n> +\n> +#include \"libcamera/internal/device_enumerator.h\"\n> +#include \"libcamera/internal/ipa_manager.h\"\n> +#include \"libcamera/internal/process.h\"\n> +\n> +namespace libcamera {\n> +\n> +class Camera;\n> +\n> +class CameraManager::Private : public Extensible::Private, public Thread\n> +{\n> +\tLIBCAMERA_DECLARE_PUBLIC(CameraManager)\n> +\n> +public:\n> +\tPrivate();\n> +\n> +\tint start();\n> +\tvoid addCamera(std::shared_ptr<Camera> camera,\n> +\t\t       const std::vector<dev_t> &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_);\n> +\tvoid removeCamera(Camera *camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n> +\n> +\t/*\n> +\t * This mutex protects\n> +\t *\n> +\t * - initialized_ and status_ during initialization\n> +\t * - cameras_ and camerasByDevnum_ after initialization\n> +\t */\n> +\tmutable Mutex mutex_;\n> +\tstd::vector<std::shared_ptr<Camera>> cameras_ LIBCAMERA_TSA_GUARDED_BY(mutex_);\n> +\tstd::map<dev_t, std::weak_ptr<Camera>> camerasByDevnum_ LIBCAMERA_TSA_GUARDED_BY(mutex_);\n\nThese three variables can be moved to the private section.\n\n> +\n> +protected:\n> +\tvoid run() override;\n> +\n> +private:\n> +\tint init();\n> +\tvoid createPipelineHandlers();\n> +\tvoid cleanup() LIBCAMERA_TSA_EXCLUDES(mutex_);\n> +\n> +\tConditionVariable cv_;\n> +\tbool initialized_ LIBCAMERA_TSA_GUARDED_BY(mutex_);\n> +\tint status_ LIBCAMERA_TSA_GUARDED_BY(mutex_);\n> +\n> +\tstd::unique_ptr<DeviceEnumerator> enumerator_;\n\nI think DeviceEnumerator can be a forward declaration, you don't need to\ninclude device_enumerator.h.\n\nWith this addressed,\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\n> +\tIPAManager ipaManager_;\n> +\tProcessManager processManager_;\n> +};\n> +\n> +} /* namespace libcamera */\n> diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build\n> index d75088059996..4b2756a4a251 100644\n> --- a/include/libcamera/internal/meson.build\n> +++ b/include/libcamera/internal/meson.build\n> @@ -15,6 +15,7 @@ libcamera_internal_headers = files([\n>      'camera.h',\n>      'camera_controls.h',\n>      'camera_lens.h',\n> +    'camera_manager.h',\n>      'camera_sensor.h',\n>      'camera_sensor_properties.h',\n>      'control_serializer.h',\n> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> index c1edefdad160..882b2d4b234c 100644\n> --- a/src/libcamera/camera_manager.cpp\n> +++ b/src/libcamera/camera_manager.cpp\n> @@ -5,27 +5,26 @@\n>   * camera_manager.h - Camera management\n>   */\n>  \n> -#include <libcamera/camera_manager.h>\n> -\n> -#include <map>\n> -\n> -#include <libcamera/camera.h>\n> +#include \"libcamera/internal/camera_manager.h\"\n>  \n>  #include <libcamera/base/log.h>\n> -#include <libcamera/base/mutex.h>\n> -#include <libcamera/base/thread.h>\n>  #include <libcamera/base/utils.h>\n>  \n> +#include <libcamera/camera.h>\n> +\n>  #include \"libcamera/internal/device_enumerator.h\"\n> -#include \"libcamera/internal/ipa_manager.h\"\n>  #include \"libcamera/internal/pipeline_handler.h\"\n> -#include \"libcamera/internal/process.h\"\n>  \n>  /**\n> - * \\file camera_manager.h\n> + * \\file libcamera/camera_manager.h\n>   * \\brief The camera manager\n>   */\n>  \n> +/**\n> + * \\file libcamera/internal/camera_manager.h\n> + * \\brief Internal camera manager support\n> + */\n> +\n>  /**\n>   * \\brief Top-level libcamera namespace\n>   */\n> @@ -33,46 +32,6 @@ namespace libcamera {\n>  \n>  LOG_DEFINE_CATEGORY(Camera)\n>  \n> -class CameraManager::Private : public Extensible::Private, public Thread\n> -{\n> -\tLIBCAMERA_DECLARE_PUBLIC(CameraManager)\n> -\n> -public:\n> -\tPrivate();\n> -\n> -\tint start();\n> -\tvoid addCamera(std::shared_ptr<Camera> camera,\n> -\t\t       const std::vector<dev_t> &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_);\n> -\tvoid removeCamera(Camera *camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n> -\n> -\t/*\n> -\t * This mutex protects\n> -\t *\n> -\t * - initialized_ and status_ during initialization\n> -\t * - cameras_ and camerasByDevnum_ after initialization\n> -\t */\n> -\tmutable Mutex mutex_;\n> -\tstd::vector<std::shared_ptr<Camera>> cameras_ LIBCAMERA_TSA_GUARDED_BY(mutex_);\n> -\tstd::map<dev_t, std::weak_ptr<Camera>> camerasByDevnum_ LIBCAMERA_TSA_GUARDED_BY(mutex_);\n> -\n> -protected:\n> -\tvoid run() override;\n> -\n> -private:\n> -\tint init();\n> -\tvoid createPipelineHandlers();\n> -\tvoid cleanup() LIBCAMERA_TSA_EXCLUDES(mutex_);\n> -\n> -\tConditionVariable cv_;\n> -\tbool initialized_ LIBCAMERA_TSA_GUARDED_BY(mutex_);\n> -\tint status_ LIBCAMERA_TSA_GUARDED_BY(mutex_);\n> -\n> -\tstd::unique_ptr<DeviceEnumerator> enumerator_;\n> -\n> -\tIPAManager ipaManager_;\n> -\tProcessManager processManager_;\n> -};\n> -\n>  CameraManager::Private::Private()\n>  \t: initialized_(false)\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 A561BC322E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 15 Jun 2023 19:37:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E2112628B5;\n\tThu, 15 Jun 2023 21:37:55 +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 45F20614FE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 15 Jun 2023 21:37:54 +0200 (CEST)","from pendragon.ideasonboard.com (213-243-189-158.bb.dnainternet.fi\n\t[213.243.189.158])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5D651C85;\n\tThu, 15 Jun 2023 21:37:22 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1686857876;\n\tbh=ryQPIyNXk/0+Ziz+4YuLQLShfUjl0BfT35VRC/zNGWo=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=L4UHOgCAeaCHUU+v5JKcD8COqC0yMSUyofywKmgSdKpP1C73oCbebV5hF//0EgO5T\n\trzYtveAwckaLQ5eA2xiTWhhu3Ee2BBpjJ2sM8uLi/pkbkOCV+wd7uI8Z8pot0fXYBg\n\tSJaZ3LrTJDV3Zt3bdg8Bi27wQboiUfmdBvx6BZrHnTVOaq01RSm5KdD01ZlbC3mNSS\n\tdvVOaRvkDEECjHRyBaR6MO96VD+qDO5j7pc2Q92uTBM0pzN0Y/kpQpa6sP89WnMIIB\n\t8Qgn1pO3Tu02Vh5K84sLzJNqsvYpYyVjH6tTNDMzbu8lJAYgAZRMedAU0a3/vRtzyp\n\txmDSemtYwX7hQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1686857842;\n\tbh=ryQPIyNXk/0+Ziz+4YuLQLShfUjl0BfT35VRC/zNGWo=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=WIy6jjJ3qH35sfeBFY6oZZp1eggLyrLIWuqJFiwtWyVFJqKeY8+SYE+MYh1XX9UkA\n\tua8Dt1RWa9IIz4G6RFUchQNrI+MHIbFEu4SlbrI/LAzQTHVZ5F65ZtFsjmQ6OXNKv7\n\t2ZQp5wzRwUdJLldWM0tTi1WclLssvjfFKfNuZ1Ew="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"WIy6jjJ3\"; dkim-atps=neutral","Date":"Thu, 15 Jun 2023 22:37:54 +0300","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20230615193754.GA14547@pendragon.ideasonboard.com>","References":"<20230615172608.378258-1-kieran.bingham@ideasonboard.com>\n\t<20230615172608.378258-3-kieran.bingham@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230615172608.378258-3-kieran.bingham@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v4 2/5] libcamera: camera_manager:\n\tMove private implementation to internal","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tAshok Sidipotu <ashok.sidipotu@collabora.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]