[libcamera-devel] [PATCH v4 16/22] libcamera: v4l2_videodevice: Pass SharedFD to open()

Hirokazu Honda hiroh at chromium.org
Tue Nov 30 06:25:19 CET 2021


Hi Laurent, thank you for the patch.

On Tue, Nov 30, 2021 at 12:39 PM Laurent Pinchart
<laurent.pinchart at ideasonboard.com> wrote:
>
> The V4L2VideoDevice::open() function that takes an open file handle
> duplicates it internally, and leaves the original handle untouched. This
> is documented but not enforced through language constructs. Fix it by
> passing a SharedFD to the function.

FileDescriptor.
ditto for the commit title.

>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Hirokazu Honda <hiroh at chromium.org>


> ---
>  include/libcamera/internal/v4l2_videodevice.h |  2 +-
>  src/libcamera/v4l2_videodevice.cpp            | 22 ++++++++-----------
>  2 files changed, 10 insertions(+), 14 deletions(-)
>
> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
> index 80b665771782..9f556f99587c 100644
> --- a/include/libcamera/internal/v4l2_videodevice.h
> +++ b/include/libcamera/internal/v4l2_videodevice.h
> @@ -184,7 +184,7 @@ public:
>         ~V4L2VideoDevice();
>
>         int open();
> -       int open(int handle, enum v4l2_buf_type type);
> +       int open(FileDescriptor handle, enum v4l2_buf_type type);
>         void close();
>
>         const char *driverName() const { return caps_.driver(); }
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index 3966483a365f..5f1cc6e2f47f 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -612,16 +612,14 @@ int V4L2VideoDevice::open()
>   * its type from the capabilities. This can be used to force a given device type
>   * for memory-to-memory devices.
>   *
> - * The file descriptor \a handle is duplicated, and the caller is responsible
> - * for closing the \a handle when it has no further use for it. The close()
> - * function will close the duplicated file descriptor, leaving \a handle
> - * untouched.
> + * The file descriptor \a handle is duplicated, no reference to the original
> + * handle is kept.
>   *
>   * \return 0 on success or a negative error code otherwise
>   */
> -int V4L2VideoDevice::open(int handle, enum v4l2_buf_type type)
> +int V4L2VideoDevice::open(FileDescriptor handle, enum v4l2_buf_type type)
>  {
> -       UniqueFD newFd(dup(handle));
> +       UniqueFD newFd = handle.dup();
>         if (!newFd.isValid()) {
>                 LOG(V4L2, Error) << "Failed to duplicate file handle: "
>                                  << strerror(errno);
> @@ -1900,12 +1898,10 @@ int V4L2M2MDevice::open()
>
>         /*
>          * The output and capture V4L2VideoDevice instances use the same file
> -        * handle for the same device node. The local file handle can be closed
> -        * as the V4L2VideoDevice::open() retains a handle by duplicating the
> -        * fd passed in.
> +        * handle for the same device node.
>          */
> -       UniqueFD fd(syscall(SYS_openat, AT_FDCWD, deviceNode_.c_str(),
> -                           O_RDWR | O_NONBLOCK));
> +       FileDescriptor fd(syscall(SYS_openat, AT_FDCWD, deviceNode_.c_str(),
> +                                 O_RDWR | O_NONBLOCK));
>         if (!fd.isValid()) {
>                 ret = -errno;
>                 LOG(V4L2, Error) << "Failed to open V4L2 M2M device: "
> @@ -1913,11 +1909,11 @@ int V4L2M2MDevice::open()
>                 return ret;
>         }
>
> -       ret = output_->open(fd.get(), V4L2_BUF_TYPE_VIDEO_OUTPUT);
> +       ret = output_->open(fd, V4L2_BUF_TYPE_VIDEO_OUTPUT);
>         if (ret)
>                 goto err;
>
> -       ret = capture_->open(fd.get(), V4L2_BUF_TYPE_VIDEO_CAPTURE);
> +       ret = capture_->open(fd, V4L2_BUF_TYPE_VIDEO_CAPTURE);
>         if (ret)
>                 goto err;
>
> --
> Regards,
>
> Laurent Pinchart
>


More information about the libcamera-devel mailing list