[libcamera-devel] [PATCH 3/4] libcamera: device_enumerator_udev: Avoid double list lookup

Jacopo Mondi jacopo at jmondi.org
Fri Sep 13 11:19:55 CEST 2019


Hi Kieran,

On Fri, Sep 13, 2019 at 09:50:23AM +0100, Kieran Bingham wrote:
> Hi Laurent,
>
> On 12/09/2019 21:03, Laurent Pinchart wrote:
> > DeviceEnumeratorUdev::populateMediaDevice() searches for orphan devices
> > in an std::list, and if found removes them using std::list::remove().
> > This ends up looking up the entry twice. Replace the remove() call with
> > erase() to fix it.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> >  src/libcamera/device_enumerator_udev.cpp | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp
> > index 210f5c1f2870..c40770911d3d 100644
> > --- a/src/libcamera/device_enumerator_udev.cpp
> > +++ b/src/libcamera/device_enumerator_udev.cpp
> > @@ -182,7 +182,8 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice>
> >  				       entity->deviceMinor());
> >
> >  		/* Take device from orphan list first, if it is in the list. */
> > -		if (std::find(orphans_.begin(), orphans_.end(), devnum) != orphans_.end()) {
> > +		auto orphan = std::find(orphans_.begin(), orphans_.end(), devnum);
> > +		if (orphan != orphans_.end()) {
> >  			std::string deviceNode = lookupDeviceNode(devnum);
> >  			if (deviceNode.empty())
> >  				return -EINVAL;
> > @@ -191,7 +192,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice>
> >  			if (ret)
> >  				return ret;
> >
> > -			orphans_.remove(devnum);
> > +			orphans_.erase(orphan);
>
> Ouch, I had to look up the difference between remove and erase. That's a
> subtle but important difference :D And I'm sure no one ever gets bitten
> by the fact that .remove() does not 'remove' an entry from a container :-D

What difference are you referring to? My understanding is that this
patch just saves one lookup by saving the result of std::find() in the
orphan variable, so that it can be reused at erase time.

Am I missing something?

>
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> >  			continue;
> >  		}
> >
> >
>
> --
> Regards
> --
> Kieran
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190913/008d7d72/attachment.sig>


More information about the libcamera-devel mailing list