diff options
author | Hirokazu Honda <hiroh@chromium.org> | 2021-06-10 16:50:18 +0900 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-12-03 19:20:36 +0200 |
commit | ccdaf8ec9012b060b9cc49f5cdaa99b474c54e27 (patch) | |
tree | 195f4424953ba9b3e26c3f1e01e8c99b5f72679e /include | |
parent | 1546a74e6484bcf44b4a2883510418d14c6db54f (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.build | 1 | ||||
-rw-r--r-- | include/libcamera/base/unique_fd.h | 69 |
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 */ |