Show a patch.

GET /api/patches/24353/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 24353,
    "url": "https://patchwork.libcamera.org/api/patches/24353/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/24353/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20250912142915.53949-3-mzamazal@redhat.com>",
    "date": "2025-09-12T14:29:03",
    "name": "[v18,02/12] libcamera: camera_manager: Construct GlobalConfiguration instance",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "971a438b44418b8e80dcff7143dc8ecba8ebec5f",
    "submitter": {
        "id": 177,
        "url": "https://patchwork.libcamera.org/api/people/177/?format=api",
        "name": "Milan Zamazal",
        "email": "mzamazal@redhat.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/24353/mbox/",
    "series": [
        {
            "id": 5441,
            "url": "https://patchwork.libcamera.org/api/series/5441/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5441",
            "date": "2025-09-12T14:29:01",
            "name": "Add global configuration file",
            "version": 18,
            "mbox": "https://patchwork.libcamera.org/series/5441/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/24353/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/24353/checks/",
    "tags": {},
    "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 C3DFCBDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 12 Sep 2025 14:29:37 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 83CA069377;\n\tFri, 12 Sep 2025 16:29:37 +0200 (CEST)",
            "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2CA5B6936D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 12 Sep 2025 16:29:36 +0200 (CEST)",
            "from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-297-BoFiCWQnPVai89g4DvcDXw-1;\n\tFri, 12 Sep 2025 10:29:30 -0400",
            "from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.93])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 78CCA1955E88; Fri, 12 Sep 2025 14:29:29 +0000 (UTC)",
            "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.224.48])\n\tby mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 7036B1800446; Fri, 12 Sep 2025 14:29:27 +0000 (UTC)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"WMLyfbv8\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1757687375;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=Ae7OLH0WGKYarra1liz+IAAMCrYAsXWQ9a9xmQ/bHk8=;\n\tb=WMLyfbv8q/7mJv6+a1dqFbTPT3OoDGjZKwFSmmKfDP68ZNgCin4si4GuivG/662qXUv7jV\n\tTMc0jNQ3hvp+CiPkWdykGi4ZwKy0RTpiR01600Evtwdi9v5bsAjMgfJ+UByJjXqiC1Ldrr\n\tB2eJHTbsCml6tI0RiEQYBWOPsBFIg00=",
        "X-MC-Unique": "BoFiCWQnPVai89g4DvcDXw-1",
        "X-Mimecast-MFC-AGG-ID": "BoFiCWQnPVai89g4DvcDXw_1757687369",
        "From": "Milan Zamazal <mzamazal@redhat.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>, Paul Elder\n\t<paul.elder@ideasonboard.com>",
        "Subject": "[PATCH v18 02/12] libcamera: camera_manager: Construct\n\tGlobalConfiguration instance",
        "Date": "Fri, 12 Sep 2025 16:29:03 +0200",
        "Message-ID": "<20250912142915.53949-3-mzamazal@redhat.com>",
        "In-Reply-To": "<20250912142915.53949-1-mzamazal@redhat.com>",
        "References": "<20250912142915.53949-1-mzamazal@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.93",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-MFC-PROC-ID": "DBjrEZ54VYe3BvgXtonsn8kROeUlQwUMDixzdEMXiaI_1757687369",
        "X-Mimecast-Originator": "redhat.com",
        "Content-Transfer-Encoding": "8bit",
        "content-type": "text/plain; charset=\"US-ASCII\"; x-default=true",
        "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>"
    },
    "content": "Global configuration is accessed via a GlobalConfiguration instance.\nThe instance is conceptually a singleton, but singletons are not welcome\nin libcamera so we must store the (preferably single) instance\nsomewhere.\n\nThis patch creates a GlobalConfiguration instance in CameraManager and\ndefines the corresponding access method.  CameraManager is typically\ninstantiated only once or a few times, it is accessible in many places\nin libcamera and the configuration can be retrieved from it and passed\nto other places if needed (it's read-only once created).  Using\nCameraManager for the purpose is still suboptimal and we use it only due\nto lack of better options.  An alternative could be Logger, which is\nstill a singleton and it's accessible from everywhere.  But with Logger,\nwe have a chicken and egg problem -- GlobalConfiguration should log\ncontingent problems with the configuration when it's loaded but if it is\ncreated in the logger then there are mutual infinite recursive calls.\nOne possible way to deal with this is to look at the environment\nvariables only during logging initialisation and apply the logging\nconfiguration when a CameraManager is constructed.  Considering there\nare intentions to remove the Logger singleton, let's omit logging\nconfiguration for now.\n\nIf there are multiple CameraManager instances, there are also multiple\nGlobalConfiguration instances, each CameraManager instance is meant to\nbe fully independent, including configuration.  They may or may not\ncontain the same data, depending on whether the global configuration\nfile in the file system was changed in the meantime.\n\nThe configuration is stored in the private CameraManager.  It's\naccessible within libcamera (via CameraManager) but it's not meant to be\naccessed by applications.\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n include/libcamera/internal/camera_manager.h | 12 ++++++++++--\n src/libcamera/camera_manager.cpp            |  8 ++++++++\n 2 files changed, 18 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h\nindex 5dfbe1f65..b8b2966b5 100644\n--- a/include/libcamera/internal/camera_manager.h\n+++ b/include/libcamera/internal/camera_manager.h\n@@ -7,8 +7,6 @@\n \n #pragma once\n \n-#include <libcamera/camera_manager.h>\n-\n #include <memory>\n #include <sys/types.h>\n #include <vector>\n@@ -18,6 +16,9 @@\n #include <libcamera/base/thread.h>\n #include <libcamera/base/thread_annotations.h>\n \n+#include <libcamera/camera_manager.h>\n+\n+#include \"libcamera/internal/global_configuration.h\"\n #include \"libcamera/internal/process.h\"\n \n namespace libcamera {\n@@ -38,6 +39,11 @@ public:\n \tvoid addCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n \tvoid removeCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n \n+\tconst GlobalConfiguration &configuration() const\n+\t{\n+\t\treturn configuration_;\n+\t}\n+\n \tIPAManager *ipaManager() const { return ipaManager_.get(); }\n \n protected:\n@@ -65,6 +71,8 @@ private:\n \tstd::unique_ptr<DeviceEnumerator> enumerator_;\n \n \tstd::unique_ptr<IPAManager> ipaManager_;\n+\n+\tconst GlobalConfiguration configuration_;\n };\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\nindex f81794bfd..dca3d9a83 100644\n--- a/src/libcamera/camera_manager.cpp\n+++ b/src/libcamera/camera_manager.cpp\n@@ -15,6 +15,7 @@\n \n #include \"libcamera/internal/camera.h\"\n #include \"libcamera/internal/device_enumerator.h\"\n+#include \"libcamera/internal/global_configuration.h\"\n #include \"libcamera/internal/ipa_manager.h\"\n #include \"libcamera/internal/pipeline_handler.h\"\n \n@@ -258,6 +259,13 @@ void CameraManager::Private::removeCamera(std::shared_ptr<Camera> camera)\n \to->cameraRemoved.emit(camera);\n }\n \n+/**\n+ * \\fn const GlobalConfiguration &CameraManager::Private::configuration() const\n+ * \\brief Get global configuration bound to the camera manager\n+ *\n+ * \\return Reference to the configuration\n+ */\n+\n /**\n  * \\fn CameraManager::Private::ipaManager() const\n  * \\brief Retrieve the IPAManager\n",
    "prefixes": [
        "v18",
        "02/12"
    ]
}