[libcamera-devel] [RFC PATCH 06/10] libcamera: V4L2Device: Use ScopedFD for a file descriptor
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Jun 6 20:18:48 CEST 2021
Hi Hiro,
Thank you for the patch.
On Thu, Apr 15, 2021 at 05:38:39PM +0900, Hirokazu Honda wrote:
> V4L2Device owns a file descriptor for a v4l2 device node. It
> should be managed by ScopedFD avoid the leakage.
>
> Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
> ---
> include/libcamera/internal/v4l2_device.h | 9 +++++----
> src/libcamera/v4l2_device.cpp | 17 +++++++----------
> src/libcamera/v4l2_videodevice.cpp | 3 ++-
> 3 files changed, 14 insertions(+), 15 deletions(-)
>
> diff --git a/include/libcamera/internal/v4l2_device.h b/include/libcamera/internal/v4l2_device.h
> index d006bf68..e0262de0 100644
> --- a/include/libcamera/internal/v4l2_device.h
> +++ b/include/libcamera/internal/v4l2_device.h
> @@ -13,6 +13,7 @@
>
> #include <linux/videodev2.h>
>
> +#include <libcamera/scoped_file_descriptor.h>
> #include <libcamera/signal.h>
>
> #include "libcamera/internal/log.h"
> @@ -26,7 +27,7 @@ class V4L2Device : protected Loggable
> {
> public:
> void close();
> - bool isOpen() const { return fd_ != -1; }
> + bool isOpen() const { return fd_.isValid(); }
>
> const ControlInfoMap &controls() const { return controls_; }
>
> @@ -46,11 +47,11 @@ protected:
> ~V4L2Device();
>
> int open(unsigned int flags);
> - int setFd(int fd);
> + int setFd(ScopedFD fd);
Should this take an rvalue reference to enable move semantics ?
>
> int ioctl(unsigned long request, void *argp);
>
> - int fd() const { return fd_; }
> + int fd() const { return fd_.get(); }
>
> private:
> void listControls();
> @@ -64,7 +65,7 @@ private:
> std::vector<std::unique_ptr<V4L2ControlId>> controlIds_;
> ControlInfoMap controls_;
> std::string deviceNode_;
> - int fd_;
> + ScopedFD fd_;
>
> EventNotifier *fdEventNotifier_;
> bool frameStartEnabled_;
> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
> index decd19ef..4fbb2d60 100644
> --- a/src/libcamera/v4l2_device.cpp
> +++ b/src/libcamera/v4l2_device.cpp
> @@ -53,7 +53,7 @@ LOG_DEFINE_CATEGORY(V4L2)
> * at open() time, and the \a logTag to prefix log messages with.
> */
> V4L2Device::V4L2Device(const std::string &deviceNode)
> - : deviceNode_(deviceNode), fd_(-1), fdEventNotifier_(nullptr),
> + : deviceNode_(deviceNode), fdEventNotifier_(nullptr),
> frameStartEnabled_(false)
> {
> }
> @@ -89,7 +89,7 @@ int V4L2Device::open(unsigned int flags)
> return ret;
> }
>
> - setFd(ret);
> + setFd(ScopedFD(ret));
>
> listControls();
>
> @@ -112,14 +112,14 @@ int V4L2Device::open(unsigned int flags)
> *
> * \return 0 on success or a negative error code otherwise
> */
> -int V4L2Device::setFd(int fd)
> +int V4L2Device::setFd(ScopedFD fd)
> {
> if (isOpen())
> return -EBUSY;
>
> - fd_ = fd;
> + fd_ = std::move(fd);
>
> - fdEventNotifier_ = new EventNotifier(fd_, EventNotifier::Exception);
> + fdEventNotifier_ = new EventNotifier(fd_.get(), EventNotifier::Exception);
> fdEventNotifier_->activated.connect(this, &V4L2Device::eventAvailable);
> fdEventNotifier_->setEnabled(false);
>
> @@ -138,10 +138,7 @@ void V4L2Device::close()
>
> delete fdEventNotifier_;
>
> - if (::close(fd_) < 0)
> - LOG(V4L2, Error) << "Failed to close V4L2 device: "
> - << strerror(errno);
> - fd_ = -1;
> + fd_.reset();
> }
>
> /**
> @@ -449,7 +446,7 @@ int V4L2Device::ioctl(unsigned long request, void *argp)
> * Printing out an error message is usually better performed
> * in the caller, which can provide more context.
> */
> - if (::ioctl(fd_, request, argp) < 0)
> + if (::ioctl(fd_.get(), request, argp) < 0)
> return -errno;
>
> return 0;
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index 12c09dc7..0bf3b5f5 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -22,6 +22,7 @@
> #include <linux/version.h>
>
> #include <libcamera/file_descriptor.h>
> +#include <libcamera/scoped_file_descriptor.h>
>
> #include "libcamera/internal/event_notifier.h"
> #include "libcamera/internal/log.h"
> @@ -614,7 +615,7 @@ int V4L2VideoDevice::open(int handle, enum v4l2_buf_type type)
> return ret;
> }
>
> - ret = V4L2Device::setFd(newFd);
> + ret = V4L2Device::setFd(ScopedFD(newFd));
> if (ret < 0) {
> LOG(V4L2, Error) << "Failed to set file handle: "
> << strerror(-ret);
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list