X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Ffile-descriptor.hpp;h=e8ddfe7a144815c15c8b729fd53027e0e923bd9d;hb=238fab718442f811eeba699216ca8e9d61cbadd0;hp=54c2e182a1bb352e5395990ae486be093d5ef4e9;hpb=cd9adb8b829564212158943a0d279bb35322ab30;p=lttng-tools.git diff --git a/src/common/file-descriptor.hpp b/src/common/file-descriptor.hpp index 54c2e182a..e8ddfe7a1 100644 --- a/src/common/file-descriptor.hpp +++ b/src/common/file-descriptor.hpp @@ -5,6 +5,9 @@ * */ +#ifndef LTTNG_FILE_DESCRIPTOR_HPP +#define LTTNG_FILE_DESCRIPTOR_HPP + #include #include @@ -16,32 +19,36 @@ namespace lttng { /* * RAII wrapper around a UNIX file descriptor. A file_descriptor's underlying - * file descriptor + * file descriptor. */ 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&& other) + { + _cleanup(); + std::swap(_raw_fd, other._raw_fd); + return *this; + } - file_descriptor(file_descriptor&& other) noexcept { - LTTNG_ASSERT(_is_valid_fd(_raw_fd)); + file_descriptor(file_descriptor&& other) noexcept + { std::swap(_raw_fd, other._raw_fd); } ~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 @@ -56,7 +63,23 @@ 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; }; } /* namespace lttng */ + +#endif /* LTTNG_FILE_DESCRIPTOR_HPP */