From patchwork Sat Mar 21 18:09: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: 3236 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4921D60415 for ; Sat, 21 Mar 2020 19:10:03 +0100 (CET) Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id BFDCF308 for ; Sat, 21 Mar 2020 19:10:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1584814202; bh=roOAZQK5OOIObpv4aTNuCySoSwr8IvsYcY3GJ7Ktix8=; h=From:To:Subject:Date:From; b=TsBL7bb0ZPJ4a/JXyPmI9MeCcFzBbKrNjXdPvzLHtihMg353Hcun1AVN8KU9z/Y93 VUSa1Mkts1TtJI4pdYKs3eRaoWBFTdosqA7Lgdqke/95qa0kPlBn30V3wU7Ww/GWIJ hrO2NwUl+6TTmmaXAMD/RubSj2VnI1a1KHA/JLus= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sat, 21 Mar 2020 20:09:50 +0200 Message-Id: <20200321180951.32685-1-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/2] libcamera: device_enumerator_udev: Update pending list in addUdevDevice 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: , X-List-Received-Date: Sat, 21 Mar 2020 18:10:03 -0000 Media devices that have unmet dependencies are added to the pending list in populateMediaDevice(). Move the code to the caller, addUdevDevice(), as it logically belongs there. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Kieran Bingham --- src/libcamera/device_enumerator_udev.cpp | 28 ++++++++----------- .../include/device_enumerator_udev.h | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp index e55350544feb..ea3f6b7c9ae0 100644 --- a/src/libcamera/device_enumerator_udev.cpp +++ b/src/libcamera/device_enumerator_udev.cpp @@ -81,7 +81,8 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev) if (!media) return -ENODEV; - int ret = populateMediaDevice(media); + DependencyMap deps; + int ret = populateMediaDevice(media.get(), &deps); if (ret < 0) { LOG(DeviceEnumerator, Warning) << "Failed to populate media device " @@ -90,10 +91,16 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev) return ret; } - if (ret) { + if (!deps.empty()) { LOG(DeviceEnumerator, Debug) << "Defer media device " << media->deviceNode() << " due to " << ret << " missing dependencies"; + + pending_.emplace_back(media, deps); + MediaDeviceDeps *mediaDeps = &pending_.back(); + for (const auto &dep : mediaDeps->deps_) + devMap_[dep.first] = mediaDeps; + return 0; } @@ -185,10 +192,9 @@ done: return 0; } -int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr &media) +int DeviceEnumeratorUdev::populateMediaDevice(MediaDevice *media, DependencyMap *deps) { std::set children; - DependencyMap deps; /* Associate entities to device node paths. */ for (MediaEntity *entity : media->entities()) { @@ -203,7 +209,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr * dependencies. */ if (orphans_.find(devnum) == orphans_.end()) { - deps[devnum].push_back(entity); + (*deps)[devnum].push_back(entity); continue; } @@ -231,17 +237,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr ++it; } - /* - * If the media device has unmet dependencies, add it to the pending - * list and update the devnum map accordingly. - */ - if (!deps.empty()) { - pending_.emplace_back(media, deps); - for (const auto &dep : deps) - devMap_[dep.first] = &pending_.back(); - } - - return deps.size(); + return 0; } /** diff --git a/src/libcamera/include/device_enumerator_udev.h b/src/libcamera/include/device_enumerator_udev.h index 6d8268620185..efaefe5dc4a3 100644 --- a/src/libcamera/include/device_enumerator_udev.h +++ b/src/libcamera/include/device_enumerator_udev.h @@ -63,7 +63,7 @@ private: std::map devMap_; int addUdevDevice(struct udev_device *dev); - int populateMediaDevice(const std::shared_ptr &media); + int populateMediaDevice(MediaDevice *media, DependencyMap *deps); std::string lookupDeviceNode(dev_t devnum); int addV4L2Device(dev_t devnum); From patchwork Sat Mar 21 18:09:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 3237 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8269760415 for ; Sat, 21 Mar 2020 19:10:03 +0100 (CET) Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 26802B27 for ; Sat, 21 Mar 2020 19:10:03 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1584814203; bh=hsv2m40wsibcz0l4Cb28SrHblXudb0lLo6R1sHZSJDA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=VAQuVzPAkBYoBabf9DaWIwHeWQr2dlmkrf42XAhpLzPR1DUzvGqF8iC4Jle7zf2yA ufhslRZaaGYB3Xy5F1X2UKiP9gImPnzNalsEaQUxNEfjtHh6fcSmVXeVMUzjodylkZ yfIKMVK9u0qbIcMpnHht6VwDJwV6f03ZjEC0w/bY= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sat, 21 Mar 2020 20:09:51 +0200 Message-Id: <20200321180951.32685-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200321180951.32685-1-laurent.pinchart@ideasonboard.com> References: <20200321180951.32685-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/2] libcamera: device_enumerator: Convey device ownership through unique_ptr 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: , X-List-Received-Date: Sat, 21 Mar 2020 18:10:03 -0000 Replace usage of shared_ptr with unique_ptr to convey media device ownership internally in the enumerators when creating the media device. Once a media device has all its dependencies met, it is converted to a shared_ptr to keep the external API unchanged. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Kieran Bingham --- src/libcamera/device_enumerator.cpp | 10 +++++----- src/libcamera/device_enumerator_sysfs.cpp | 8 ++++---- src/libcamera/device_enumerator_udev.cpp | 8 ++++---- src/libcamera/include/device_enumerator.h | 4 ++-- src/libcamera/include/device_enumerator_sysfs.h | 2 +- src/libcamera/include/device_enumerator_udev.h | 8 ++++---- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp index 89ed67ebb115..dd17e3e32e6c 100644 --- a/src/libcamera/device_enumerator.cpp +++ b/src/libcamera/device_enumerator.cpp @@ -208,9 +208,9 @@ DeviceEnumerator::~DeviceEnumerator() * * \return Created media device instance on success, or nullptr otherwise */ -std::shared_ptr DeviceEnumerator::createDevice(const std::string &deviceNode) +std::unique_ptr DeviceEnumerator::createDevice(const std::string &deviceNode) { - std::shared_ptr media = std::make_shared(deviceNode); + std::unique_ptr media = std::make_unique(deviceNode); int ret = media->populate(); if (ret < 0) { @@ -236,12 +236,12 @@ std::shared_ptr DeviceEnumerator::createDevice(const std::string &d * This method shall be called after all members of the entities of the * media graph have been confirmed to be initialized. */ -void DeviceEnumerator::addDevice(const std::shared_ptr &media) +void DeviceEnumerator::addDevice(std::unique_ptr &&media) { LOG(DeviceEnumerator, Debug) << "Added device " << media->deviceNode() << ": " << media->driver(); - devices_.push_back(media); + devices_.push_back(std::move(media)); } /** @@ -290,7 +290,7 @@ void DeviceEnumerator::removeDevice(const std::string &deviceNode) */ std::shared_ptr DeviceEnumerator::search(const DeviceMatch &dm) { - for (std::shared_ptr media : devices_) { + for (std::shared_ptr &media : devices_) { if (media->busy()) continue; diff --git a/src/libcamera/device_enumerator_sysfs.cpp b/src/libcamera/device_enumerator_sysfs.cpp index 197ca235879b..3446db59e9d4 100644 --- a/src/libcamera/device_enumerator_sysfs.cpp +++ b/src/libcamera/device_enumerator_sysfs.cpp @@ -72,11 +72,11 @@ int DeviceEnumeratorSysfs::enumerate() continue; } - std::shared_ptr media = createDevice(devnode); + std::unique_ptr media = createDevice(devnode); if (!media) continue; - if (populateMediaDevice(media) < 0) { + if (populateMediaDevice(media.get()) < 0) { LOG(DeviceEnumerator, Warning) << "Failed to populate media device " << media->deviceNode() @@ -84,7 +84,7 @@ int DeviceEnumeratorSysfs::enumerate() continue; } - addDevice(media); + addDevice(std::move(media)); } closedir(dir); @@ -92,7 +92,7 @@ int DeviceEnumeratorSysfs::enumerate() return 0; } -int DeviceEnumeratorSysfs::populateMediaDevice(const std::shared_ptr &media) +int DeviceEnumeratorSysfs::populateMediaDevice(MediaDevice *media) { /* Associate entities to device node paths. */ for (MediaEntity *entity : media->entities()) { diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp index ea3f6b7c9ae0..9cbc7e47d2d9 100644 --- a/src/libcamera/device_enumerator_udev.cpp +++ b/src/libcamera/device_enumerator_udev.cpp @@ -76,7 +76,7 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev) return -ENODEV; if (!strcmp(subsystem, "media")) { - std::shared_ptr media = + std::unique_ptr media = createDevice(udev_device_get_devnode(dev)); if (!media) return -ENODEV; @@ -96,7 +96,7 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev) << "Defer media device " << media->deviceNode() << " due to " << ret << " missing dependencies"; - pending_.emplace_back(media, deps); + pending_.emplace_back(std::move(media), std::move(deps)); MediaDeviceDeps *mediaDeps = &pending_.back(); for (const auto &dep : mediaDeps->deps_) devMap_[dep.first] = mediaDeps; @@ -104,7 +104,7 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev) return 0; } - addDevice(media); + addDevice(std::move(media)); return 0; } @@ -319,7 +319,7 @@ int DeviceEnumeratorUdev::addV4L2Device(dev_t devnum) LOG(DeviceEnumerator, Debug) << "All dependencies for media device " << deps->media_->deviceNode() << " found"; - addDevice(deps->media_); + addDevice(std::move(deps->media_)); pending_.remove(*deps); } diff --git a/src/libcamera/include/device_enumerator.h b/src/libcamera/include/device_enumerator.h index 770f42772270..433e357aebae 100644 --- a/src/libcamera/include/device_enumerator.h +++ b/src/libcamera/include/device_enumerator.h @@ -44,8 +44,8 @@ public: std::shared_ptr search(const DeviceMatch &dm); protected: - std::shared_ptr createDevice(const std::string &deviceNode); - void addDevice(const std::shared_ptr &media); + std::unique_ptr createDevice(const std::string &deviceNode); + void addDevice(std::unique_ptr &&media); void removeDevice(const std::string &deviceNode); private: diff --git a/src/libcamera/include/device_enumerator_sysfs.h b/src/libcamera/include/device_enumerator_sysfs.h index 9063f6a75e11..5a5c9b0f5a31 100644 --- a/src/libcamera/include/device_enumerator_sysfs.h +++ b/src/libcamera/include/device_enumerator_sysfs.h @@ -23,7 +23,7 @@ public: int enumerate(); private: - int populateMediaDevice(const std::shared_ptr &media); + int populateMediaDevice(MediaDevice *media); std::string lookupDeviceNode(int major, int minor); }; diff --git a/src/libcamera/include/device_enumerator_udev.h b/src/libcamera/include/device_enumerator_udev.h index efaefe5dc4a3..fdce4520f33a 100644 --- a/src/libcamera/include/device_enumerator_udev.h +++ b/src/libcamera/include/device_enumerator_udev.h @@ -43,9 +43,9 @@ private: using DependencyMap = std::map>; struct MediaDeviceDeps { - MediaDeviceDeps(const std::shared_ptr &media, - const DependencyMap &deps) - : media_(media), deps_(deps) + MediaDeviceDeps(std::unique_ptr &&media, + DependencyMap &&deps) + : media_(std::move(media)), deps_(std::move(deps)) { } @@ -54,7 +54,7 @@ private: return media_ == other.media_; } - std::shared_ptr media_; + std::unique_ptr media_; DependencyMap deps_; };