libcamera: device_enumerator_udev: Update pending list in addUdevDevice

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 <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2020-03-21 19:54:20 +02:00
parent 74c99b41e7
commit e75ef59e02
2 changed files with 13 additions and 17 deletions

View file

@ -81,7 +81,8 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev)
if (!media) if (!media)
return -ENODEV; return -ENODEV;
int ret = populateMediaDevice(media); DependencyMap deps;
int ret = populateMediaDevice(media.get(), &deps);
if (ret < 0) { if (ret < 0) {
LOG(DeviceEnumerator, Warning) LOG(DeviceEnumerator, Warning)
<< "Failed to populate media device " << "Failed to populate media device "
@ -90,10 +91,16 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev)
return ret; return ret;
} }
if (ret) { if (!deps.empty()) {
LOG(DeviceEnumerator, Debug) LOG(DeviceEnumerator, Debug)
<< "Defer media device " << media->deviceNode() << "Defer media device " << media->deviceNode()
<< " due to " << ret << " missing dependencies"; << " 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; return 0;
} }
@ -185,10 +192,9 @@ done:
return 0; return 0;
} }
int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice> &media) int DeviceEnumeratorUdev::populateMediaDevice(MediaDevice *media, DependencyMap *deps)
{ {
std::set<dev_t> children; std::set<dev_t> children;
DependencyMap deps;
/* Associate entities to device node paths. */ /* Associate entities to device node paths. */
for (MediaEntity *entity : media->entities()) { for (MediaEntity *entity : media->entities()) {
@ -203,7 +209,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice>
* dependencies. * dependencies.
*/ */
if (orphans_.find(devnum) == orphans_.end()) { if (orphans_.find(devnum) == orphans_.end()) {
deps[devnum].push_back(entity); (*deps)[devnum].push_back(entity);
continue; continue;
} }
@ -231,17 +237,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice>
++it; ++it;
} }
/* return 0;
* 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();
} }
/** /**

View file

@ -63,7 +63,7 @@ private:
std::map<dev_t, MediaDeviceDeps *> devMap_; std::map<dev_t, MediaDeviceDeps *> devMap_;
int addUdevDevice(struct udev_device *dev); int addUdevDevice(struct udev_device *dev);
int populateMediaDevice(const std::shared_ptr<MediaDevice> &media); int populateMediaDevice(MediaDevice *media, DependencyMap *deps);
std::string lookupDeviceNode(dev_t devnum); std::string lookupDeviceNode(dev_t devnum);
int addV4L2Device(dev_t devnum); int addV4L2Device(dev_t devnum);