From patchwork Fri Sep 18 07:59:46 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 28320 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 510DFC3359 for ; Fri, 18 Sep 2026 08:07:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C42B768721; Fri, 18 Sep 2026 10:07:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="hN3D/3io"; dkim-atps=neutral Received: from mail-wr2-x10.google.com (mail-wr2-x10.google.com [IPv6:2a00:1450:4864:30::10]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BD5E56849B for ; Fri, 18 Sep 2026 10:07:46 +0200 (CEST) Received: by mail-wr2-x10.google.com with SMTP id ffacd0b85a97d-4843971bdd0so58204f8f.1 for ; Fri, 18 Sep 2026 01:07:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1789718866; x=1790323666; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=GuCWaR7GOfdOg7PbLYPUwC1++CD3y43VeTiFu4okMpQ=; b=hN3D/3ioPXVrJfr1kbbKRV0bI9Zf6ZiGf1G/YGI7B42ON5uELSkPno3nc0ffbWTeFY /W6FiNVHBftO7vfUSl+SV/MJBy4xRzUOdt0ue8q84yImmOcg/i00uS+cX2KIWIR7he3D hk99qyE1RWMoosbd3sF1NjnqdY1kIWT4F4KdQpryRq85agwCKRsgB7EpwWqxUXQjVfwO 0KOyC+NqRBEFfVhq4c5hk18GYETwlm71mUPyU0ew9Cj4QOjUu2BI05a7pV0XTlsjEEnI 4nqtbYWh03mi4AZp0SoD2EcF3uq/OmSifxHERWiObMmgs4Sga1LP5F4ZHYURKIxreIUS woGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789718866; x=1790323666; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=GuCWaR7GOfdOg7PbLYPUwC1++CD3y43VeTiFu4okMpQ=; b=ch1JPfb+FAL9DRPsJyk23erQOl0XX+lW/s3N2h7+qqwS0ug3koWWulXD/oiBBNdSUY OYIJXooTFYDFpww+2GPf4YYYGU/E4gSskxfIOEWmUi4bmAmIztDW79XzrGFkr8IzQoeW dDQ3czFWdSqe1do+5WHN+kTR5/ZMpavM0hcZg88iWUvkMnvmsIhe8XBeTvodu9KdmKxB OKjSsR6PevcoJVPTdpydmmZPwnUE2477vU+5CPsCSzbt3g2ECTH5wowX1SvqvpYzd2aw o4XLw0NFfw2W48pPOnx0uWPT2DcXeQv9rPQpAlv8Nw45xCq8xZzvViTY+jf2uzqWjyvW LmZQ== X-Gm-Message-State: AFuF++k66Z+PnTkLWvjNLGf1U2C4f5g9fl5dOJCDL2k1yyUTcHRCnTE1 uoSJu5a3+n/bSJ1L45xlCaZ6fDl+IxCpKI8dDgwzMndcR5rU164tmfE4HBXTB0UhM6VPDnkm1jT 7b+tpvq0= X-Gm-Gg: AYBFou0Yqp7Hedmil1o+2Mt+B0BpnXPpEgErETDDmHv3AXmx3AzwjkVX4nU09uokkDu q05jxtR1EeDr3AC5uJRTVUFeWwxzjaQh2UJRWZE2cH6aOZ682xYLBDhF8ySOFFt6PANYSr6XrQK 1IUlvtYgL6ug0R02wKIe4wNWab+tYRK+0D68UOuNH4xXFlmWJn2ynwn7H1YgSaAtPNsgv1DE4D6 uNQVhvcfgt8yxaxC4zNwKs0nY3xiA3OlllSs9ye6UHOJ2NhtTKMweRlhYuQznzqJAMJTuZBb/WH ByRme2K8IXgYOFGuIkyUnQcmLGQFD+7g1tcZE8ibtFrthg2OXJF++MOfpOHB0aSDUuYmvFXURy8 i9Lux+H3VU8um5A1SgRHG8jCcB6RvlmNhqVta9o8eGCLOoKJ479SRBT1XVD0noc/zCPwGkXJw3i 8FKrt7HCkgoiUiw1fd+UeiHabqksocrJs2dm2NqAMp6rYMNoW3M1QWkKwhy6seLLmXVk7wSgaWG HCigtXQDUJ5amZSkQknfbsD6LxCjgthOE7XT21L2Nc4AeQvl9dw1ZINgc3UbXVI3LJqArnPkOwm mr71SbOL1853mH99reWlfhe+0Z5JA3asm5DwpMFSDW2fnMFqBwDXSZmtjnKVRHbKmO2IvU5pJl5 MA44rS3FIwjLQ2xv/1HB6i8xwcaWelP+cCA4= X-Received: by 2002:a05:6000:4010:b0:487:981:4e07 with SMTP id ffacd0b85a97d-4871fa86624mr1351100f8f.4.1789718866247; Fri, 18 Sep 2026 01:07:46 -0700 (PDT) Received: from naush-dell.pitowers.org ([2a00:1098:3142:1f:45e3:df8b:2b18:6253]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-487203f077fsm1742230f8f.26.2026.09.18.01.07.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 01:07:45 -0700 (PDT) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Cc: Naushir Patuck Subject: [RFC PATCH v1 08/20] libcamera: camera_manager: Defer IPAManager construction to first use Date: Fri, 18 Sep 2026 08:59:46 +0100 Message-ID: <20260918080734.1228227-9-naush@raspberrypi.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918080734.1228227-1-naush@raspberrypi.com> References: <20260918080734.1228227-1-naush@raspberrypi.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The IPAManager scans, loads and validates every IPA module on disk, but none of that work is needed until a pipeline handler creates an IPA for a camera. Construct the IPAManager lazily on first access instead of unconditionally during camera manager initialisation. Access is done exclusively through the camera manager thread, so no additional locking is required. Signed-off-by: Naushir Patuck --- include/libcamera/internal/camera_manager.h | 2 +- src/libcamera/camera_manager.cpp | 24 ++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h index 755928ce60a5..cfedee433857 100644 --- a/include/libcamera/internal/camera_manager.h +++ b/include/libcamera/internal/camera_manager.h @@ -44,7 +44,7 @@ public: return configuration_; } - IPAManager *ipaManager() const { return ipaManager_.get(); } + IPAManager *ipaManager(); protected: void run() override; diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index 0dd4e0c590a1..784ae012e280 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -91,11 +91,25 @@ void CameraManager::Private::run() cleanup(); } -int CameraManager::Private::init() +/* + * Retrieve the IPA manager, constructing it on first use. IPA modules are + * only needed once a camera is initialised, so this defers the module scan + * until that point. + */ +IPAManager *CameraManager::Private::ipaManager() { - CameraManager *const o = LIBCAMERA_O_PTR(); - ipaManager_ = std::make_unique(*o); + ASSERT(Thread::current() == this); + + if (!ipaManager_) { + CameraManager *const o = LIBCAMERA_O_PTR(); + ipaManager_ = std::make_unique(*o); + } + return ipaManager_.get(); +} + +int CameraManager::Private::init() +{ enumerator_ = DeviceEnumerator::create(); if (!enumerator_ || enumerator_->enumerate()) return -ENODEV; @@ -270,8 +284,8 @@ void CameraManager::Private::removeCamera(std::shared_ptr camera) /** * \fn CameraManager::Private::ipaManager() const - * \brief Retrieve the IPAManager - * \context This function is \threadsafe. + * \brief Retrieve the IPAManager, constructing it on first use + * \context This function shall be called from the CameraManager thread. * \return The IPAManager for this CameraManager */ #endif /* __DOXYGEN_PUBLIC__ */