summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorHirokazu Honda <hiroh@chromium.org>2021-06-10 16:50:18 +0900
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-12-03 19:20:36 +0200
commitccdaf8ec9012b060b9cc49f5cdaa99b474c54e27 (patch)
tree195f4424953ba9b3e26c3f1e01e8c99b5f72679e /include
parent1546a74e6484bcf44b4a2883510418d14c6db54f (diff)
libcamera: base: Introduce UniqueFD
This introduces UniqueFD. It acts like unique_ptr to a file descriptor. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
Diffstat (limited to 'include')
-rw-r--r--include/libcamera/base/meson.build1
-rw-r--r--include/libcamera/base/unique_fd.h69
2 files changed, 70 insertions, 0 deletions
diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
index abd4cfc7..fce6eaa4 100644
--- a/include/libcamera/base/meson.build
+++ b/include/libcamera/base/meson.build
@@ -24,6 +24,7 @@ libcamera_base_headers = files([
'thread.h',
'thread_annotations.h',
'timer.h',
+ 'unique_fd.h',
'utils.h',
])
diff --git a/include/libcamera/base/unique_fd.h b/include/libcamera/base/unique_fd.h
new file mode 100644
index 00000000..ae4d96b7
--- /dev/null
+++ b/include/libcamera/base/unique_fd.h
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * unique_fd.h - File descriptor wrapper that owns a file descriptor.
+ */
+
+#pragma once
+
+#include <utility>
+
+#include <libcamera/base/class.h>
+#include <libcamera/base/compiler.h>
+
+namespace libcamera {
+
+class UniqueFD final
+{
+public:
+ UniqueFD()
+ : fd_(-1)
+ {
+ }
+
+ explicit UniqueFD(int fd)
+ : fd_(fd)
+ {
+ }
+
+ UniqueFD(UniqueFD &&other)
+ : fd_(other.release())
+ {
+ }
+
+ ~UniqueFD()
+ {
+ reset();
+ }
+
+ UniqueFD &operator=(UniqueFD &&other)
+ {
+ reset(other.release());
+ return *this;
+ }
+
+ __nodiscard int release()
+ {
+ int fd = fd_;
+ fd_ = -1;
+ return fd;
+ }
+
+ void reset(int fd = -1);
+
+ void swap(UniqueFD &other)
+ {
+ std::swap(fd_, other.fd_);
+ }
+
+ int get() const { return fd_; }
+ bool isValid() const { return fd_ >= 0; }
+
+private:
+ LIBCAMERA_DISABLE_COPY(UniqueFD)
+
+ int fd_;
+};
+
+} /* namespace libcamera */