libcamera: base: file_descriptor: Return UniqueFD from dup()

The dup() function returns a duplicate of the file descriptor. Wrapping
it in a FileDescriptor isn't wrong as such, but it prevents from using
it in contexts where a UniqueFD is needed. As the duplicate is
guaranteed to have a single owner when created, return it as a UniqueFD
instead. A FileDescriptor can easily be created from the UniqueFD if
desired.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2021-11-28 19:50:43 +02:00
parent 1d0dbc0da8
commit fcf98514cb
2 changed files with 15 additions and 9 deletions

View file

@ -28,7 +28,7 @@ public:
bool isValid() const { return fd_ != nullptr; }
int fd() const { return fd_ ? fd_->fd() : -1; }
FileDescriptor dup() const;
UniqueFD dup() const;
private:
class Descriptor

View file

@ -222,17 +222,23 @@ FileDescriptor &FileDescriptor::operator=(FileDescriptor &&other)
* \brief Duplicate a FileDescriptor
*
* Duplicating a FileDescriptor creates a duplicate of the wrapped file
* descriptor and returns a new FileDescriptor instance that wraps the
* duplicate. The fd() function of the original and duplicate instances will
* return different values. The duplicate instance will not be affected by
* destruction of the original instance or its copies.
* descriptor and returns a UniqueFD that owns the duplicate. The fd() function
* of the original and the get() function of the duplicate will return different
* values. The duplicate instance will not be affected by destruction of the
* original instance or its copies.
*
* \return A new FileDescriptor instance wrapping a duplicate of the original
* file descriptor
* \return A UniqueFD owning a duplicate of the original file descriptor
*/
FileDescriptor FileDescriptor::dup() const
UniqueFD FileDescriptor::dup() const
{
return FileDescriptor(fd());
UniqueFD dupFd(::dup(fd()));
if (!dupFd.isValid()) {
int ret = -errno;
LOG(FileDescriptor, Error)
<< "Failed to dup() fd: " << strerror(-ret);
}
return dupFd;
}
FileDescriptor::Descriptor::Descriptor(int fd, bool duplicate)