From patchwork Tue Nov 3 01:02:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10315 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 BE1FDBDB1E for ; Tue, 3 Nov 2020 01:03:47 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7839162BA4; Tue, 3 Nov 2020 02:03:47 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="iJYgdXXT"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9985362B92 for ; Tue, 3 Nov 2020 02:03:44 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 42EAC51D for ; Tue, 3 Nov 2020 02:03:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1604365424; bh=S/+oWbwzDQ+yEKTn9LIKmMPBFty3wiN/sxWSzI88K2E=; h=From:To:Subject:Date:In-Reply-To:References:From; b=iJYgdXXTvrHvbIDccH2KyWgI7VZyHVuLzT+HbatDvD+jnMZr7M9AFTNyPa4WJkp4o hiufyEfJkfQqZ8yRtwOl+JWWFgggdqLg/wAmY/EEn7PdVHNROrTtbgMPbGGQ88+mYT uJIiLdVtiHE12ADNOM/r/5hmKiSKQ6dKhZTSQcAM= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Nov 2020 03:02:50 +0200 Message-Id: <20201103010251.14689-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201103010251.14689-1-laurent.pinchart@ideasonboard.com> References: <20201103010251.14689-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 3/4] libcamera: camera_manager: Inherit from Extensible 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" Use the d-pointer infrastructure offered by the Extensible class to replace the custom implementation. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- Changes since v1: - Declare variables explicitly --- include/libcamera/camera_manager.h | 7 ++-- src/libcamera/camera_manager.cpp | 55 +++++++++++++++++++----------- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h index 9eb2b6f5a5f5..6d5341c76412 100644 --- a/include/libcamera/camera_manager.h +++ b/include/libcamera/camera_manager.h @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -20,8 +21,9 @@ namespace libcamera { class Camera; class EventDispatcher; -class CameraManager : public Object +class CameraManager : public Object, public Extensible { + LIBCAMERA_DECLARE_PRIVATE(CameraManager) public: CameraManager(); CameraManager(const CameraManager &) = delete; @@ -50,9 +52,6 @@ public: private: static const std::string version_; static CameraManager *self_; - - class Private; - std::unique_ptr p_; }; } /* namespace libcamera */ diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index 3fef69633028..427ea5daf671 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -34,8 +34,10 @@ namespace libcamera { LOG_DEFINE_CATEGORY(Camera) -class CameraManager::Private : public Thread +class CameraManager::Private : public Extensible::Private, public Thread { + LIBCAMERA_DECLARE_PUBLIC(CameraManager) + public: Private(CameraManager *cm); @@ -62,8 +64,6 @@ private: void createPipelineHandlers(); void cleanup(); - CameraManager *cm_; - std::condition_variable cv_; bool initialized_; int status_; @@ -75,7 +75,7 @@ private: }; CameraManager::Private::Private(CameraManager *cm) - : cm_(cm), initialized_(false) + : Extensible::Private(cm), initialized_(false) { } @@ -136,6 +136,8 @@ int CameraManager::Private::init() void CameraManager::Private::createPipelineHandlers() { + CameraManager *const o = LIBCAMERA_O_PTR(); + /* * \todo Try to read handlers and order from configuration * file and only fallback on all handlers if there is no @@ -153,7 +155,7 @@ void CameraManager::Private::createPipelineHandlers() * all pipelines it can provide. */ while (1) { - std::shared_ptr pipe = factory->create(cm_); + std::shared_ptr pipe = factory->create(o); if (!pipe->match(enumerator_.get())) break; @@ -264,7 +266,7 @@ void CameraManager::Private::removeCamera(Camera *camera) CameraManager *CameraManager::self_ = nullptr; CameraManager::CameraManager() - : p_(new CameraManager::Private(this)) + : Extensible(new CameraManager::Private(this)) { if (self_) LOG(Camera, Fatal) @@ -292,9 +294,11 @@ CameraManager::~CameraManager() */ int CameraManager::start() { + Private *const d = LIBCAMERA_D_PTR(); + LOG(Camera, Info) << "libcamera " << version_; - int ret = p_->start(); + int ret = d->start(); if (ret) LOG(Camera, Error) << "Failed to start camera manager: " << strerror(-ret); @@ -314,8 +318,9 @@ int CameraManager::start() */ void CameraManager::stop() { - p_->exit(); - p_->wait(); + Private *const d = LIBCAMERA_D_PTR(); + d->exit(); + d->wait(); } /** @@ -331,9 +336,11 @@ void CameraManager::stop() */ std::vector> CameraManager::cameras() const { - MutexLocker locker(p_->mutex_); + const Private *const d = LIBCAMERA_D_PTR(); - return p_->cameras_; + MutexLocker locker(d->mutex_); + + return d->cameras_; } /** @@ -349,9 +356,11 @@ std::vector> CameraManager::cameras() const */ std::shared_ptr CameraManager::get(const std::string &id) { - MutexLocker locker(p_->mutex_); + Private *const d = LIBCAMERA_D_PTR(); - for (std::shared_ptr camera : p_->cameras_) { + MutexLocker locker(d->mutex_); + + for (std::shared_ptr camera : d->cameras_) { if (camera->id() == id) return camera; } @@ -377,10 +386,12 @@ std::shared_ptr CameraManager::get(const std::string &id) */ std::shared_ptr CameraManager::get(dev_t devnum) { - MutexLocker locker(p_->mutex_); + Private *const d = LIBCAMERA_D_PTR(); - auto iter = p_->camerasByDevnum_.find(devnum); - if (iter == p_->camerasByDevnum_.end()) + MutexLocker locker(d->mutex_); + + auto iter = d->camerasByDevnum_.find(devnum); + if (iter == d->camerasByDevnum_.end()) return nullptr; return iter->second.lock(); @@ -431,9 +442,11 @@ std::shared_ptr CameraManager::get(dev_t devnum) void CameraManager::addCamera(std::shared_ptr camera, const std::vector &devnums) { - ASSERT(Thread::current() == p_.get()); + Private *const d = LIBCAMERA_D_PTR(); - p_->addCamera(camera, devnums); + ASSERT(Thread::current() == d); + + d->addCamera(camera, devnums); cameraAdded.emit(camera); } @@ -449,9 +462,11 @@ void CameraManager::addCamera(std::shared_ptr camera, */ void CameraManager::removeCamera(std::shared_ptr camera) { - ASSERT(Thread::current() == p_.get()); + Private *const d = LIBCAMERA_D_PTR(); - p_->removeCamera(camera.get()); + ASSERT(Thread::current() == d); + + d->removeCamera(camera.get()); cameraRemoved.emit(camera); }