From b37c485170fc29ed99e21a1c9e8a3bb3b24c184b Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Wed, 29 Mar 2023 15:13:18 -0400 Subject: [PATCH] file-desrcriptor: add assignment operator MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau Change-Id: I65ec468e0825801db47da6b1298d0bc09028415d --- src/common/file-descriptor.hpp | 36 ++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/common/file-descriptor.hpp b/src/common/file-descriptor.hpp index 8d6b64be4..0ddc2b91c 100644 --- a/src/common/file-descriptor.hpp +++ b/src/common/file-descriptor.hpp @@ -20,14 +20,23 @@ namespace lttng { */ class file_descriptor { public: - explicit file_descriptor(int raw_fd) noexcept : _raw_fd{raw_fd} + file_descriptor() + { + } + + explicit file_descriptor(int raw_fd) noexcept : _raw_fd{ raw_fd } { LTTNG_ASSERT(_is_valid_fd(_raw_fd)); } file_descriptor(const file_descriptor&) = delete; file_descriptor& operator=(const file_descriptor&) = delete; - file_descriptor& operator=(file_descriptor&&) = delete; + file_descriptor& operator=(file_descriptor&& other) + { + _cleanup(); + std::swap(_raw_fd, other._raw_fd); + return *this; + } file_descriptor(file_descriptor&& other) noexcept { @@ -36,14 +45,7 @@ public: ~file_descriptor() { - if (!_is_valid_fd(_raw_fd)) { - return; - } - - const auto ret = ::close(_raw_fd); - if (ret) { - PERROR("Failed to close file descriptor: fd=%i", _raw_fd); - } + _cleanup(); } int fd() const noexcept @@ -58,6 +60,20 @@ private: return fd >= 0; } + void _cleanup() + { + if (!_is_valid_fd(_raw_fd)) { + return; + } + + const auto ret = ::close(_raw_fd); + + _raw_fd = -1; + if (ret) { + PERROR("Failed to close file descriptor: fd=%i", _raw_fd); + } + } + int _raw_fd = -1; }; -- 2.34.1