Patch Detail
Show a patch.
GET /api/1.1/patches/23566/?format=api
{ "id": 23566, "url": "https://patchwork.libcamera.org/api/1.1/patches/23566/?format=api", "web_url": "https://patchwork.libcamera.org/patch/23566/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/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": "<20250616084733.18707-4-mzamazal@redhat.com>", "date": "2025-06-16T08:47:21", "name": "[v10,03/13] config: Make GlobalConfiguration instance", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "a3e2236afd12c4e7ed52e0ccf9ef013a68a9128c", "submitter": { "id": 177, "url": "https://patchwork.libcamera.org/api/1.1/people/177/?format=api", "name": "Milan Zamazal", "email": "mzamazal@redhat.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/23566/mbox/", "series": [ { "id": 5220, "url": "https://patchwork.libcamera.org/api/1.1/series/5220/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5220", "date": "2025-06-16T08:47:18", "name": "Add global configuration file", "version": 10, "mbox": "https://patchwork.libcamera.org/series/5220/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/23566/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/23566/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 2AD25C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Jun 2025 08:48:00 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D5D2268DD1;\n\tMon, 16 Jun 2025 10:47:59 +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 146B568DB4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Jun 2025 10:47:58 +0200 (CEST)", "from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-627-lqtp30leOIiaxpdNGN-QEQ-1;\n\tMon, 16 Jun 2025 04:47:53 -0400", "from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.15])\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-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 8263B1800343; Mon, 16 Jun 2025 08:47:52 +0000 (UTC)", "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.226.135])\n\tby mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 5ABC01956094; Mon, 16 Jun 2025 08:47:49 +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=\"D4BMe33y\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1750063677;\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=Tz5GVy7X6bJSyGK+oTefH1l7yTyGVl5UdlTHfmSnG6I=;\n\tb=D4BMe33ySd/11kf6x0Nw5flchTfQUz/fGE1OIwIqNVWK0y0Oz9DoP//mlcnBhgTSJerMog\n\tZZ1sy1wz1oNXf5rvwGn2ZQ2Bw6KqvVCEf4imzU4anbwZw4BbFMLgJ/cEjRRS5OiO12nTpG\n\tIw1zsYgtUbYsL46n8eoHajipd9Iyero=", "X-MC-Unique": "lqtp30leOIiaxpdNGN-QEQ-1", "X-Mimecast-MFC-AGG-ID": "lqtp30leOIiaxpdNGN-QEQ_1750063672", "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<pobrn@protonmail.com>, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>", "Subject": "[PATCH v10 03/13] config: Make GlobalConfiguration instance", "Date": "Mon, 16 Jun 2025 10:47:21 +0200", "Message-ID": "<20250616084733.18707-4-mzamazal@redhat.com>", "In-Reply-To": "<20250616084733.18707-1-mzamazal@redhat.com>", "References": "<20250616084733.18707-1-mzamazal@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.15", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "nWu5k5-nP9lXZEGPDczMasRSBT-BEppn-CzqeOnBNYs_1750063672", "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\nmany places in libcamera and the configuration can be retrieved from it\nand passed to other places if needed (it's read-only once created).\nUsing CameraManager for the purpose is still suboptimal and we use it\nonly due to lack of better options. An alternative could be Logger,\nwhich is still a singleton and it's accessible from everywhere. But\nwith Logger, we have a chicken and egg problem -- GlobalConfiguration\nshould log contingent problems with the configuration when it's loaded\nbut if it is created in the logger then there are mutual infinite\nrecursive calls. Perhaps some acceptable workaround could be found,\nwhich would also allow an easier logging configuration.\n\nIf there are multiple CameraManager instances, there are also multiple\nGlobalConfiguration instances. They may or may not contain the same\ndata, depending on whether the global configuration file in the file\nsystem was changed in the meantime. This is dirty and a potential\nsource of trouble (although not expected to have much impact in\npractice) but there is no idea how to do better if we want to avoid\nhaving GlobalConfiguration singleton or dealing with the logging\nproblem.\n\nThe configuration is stored in CameraManager privately, it's not meant\nto be accessed by applications.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n include/libcamera/internal/camera_manager.h | 8 ++++++++\n src/libcamera/camera_manager.cpp | 8 ++++++++\n 2 files changed, 16 insertions(+)", "diff": "diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h\nindex 0150ca61f..e8082eb34 100644\n--- a/include/libcamera/internal/camera_manager.h\n+++ b/include/libcamera/internal/camera_manager.h\n@@ -18,6 +18,7 @@\n #include <libcamera/base/thread.h>\n #include <libcamera/base/thread_annotations.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@@ -66,6 +72,8 @@ private:\n \n \tstd::unique_ptr<IPAManager> ipaManager_;\n \tProcessManager processManager_;\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 e62e7193c..f3b4ec708 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@@ -254,6 +255,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": [ "v10", "03/13" ] }