[libcamera-devel,v4.1,07/22] libcamera: base: file_descriptor: Return UniqueFD from dup()
diff mbox series

Message ID 20211130102736.1768-1-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • Untitled series #2781
Related show

Commit Message

Laurent Pinchart Nov. 30, 2021, 10:27 a.m. UTC
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>
---
Changes since v4:

- Store ::dup() return value directly in UniqueFD
---
 include/libcamera/base/file_descriptor.h |  2 +-
 src/libcamera/base/file_descriptor.cpp   | 22 ++++++++++++++--------
 2 files changed, 15 insertions(+), 9 deletions(-)

Patch
diff mbox series

diff --git a/include/libcamera/base/file_descriptor.h b/include/libcamera/base/file_descriptor.h
index 74292eba04f5..12a43f95d414 100644
--- a/include/libcamera/base/file_descriptor.h
+++ b/include/libcamera/base/file_descriptor.h
@@ -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
diff --git a/src/libcamera/base/file_descriptor.cpp b/src/libcamera/base/file_descriptor.cpp
index da696b2501cd..8e181abc44bb 100644
--- a/src/libcamera/base/file_descriptor.cpp
+++ b/src/libcamera/base/file_descriptor.cpp
@@ -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)