summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
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 */