diff options
author | Niall Douglas (s [underscore] sourceforge {at} nedprod [dot] com) <spamtrap@nedprod.com> | 2018-08-14 22:05:04 +0300 |
---|---|---|
committer | Niall Douglas (s [underscore] sourceforge {at} nedprod [dot] com) <spamtrap@nedprod.com> | 2018-08-14 22:05:04 +0300 |
commit | 83b7ad9bfda9af36414d8d6acac454288cb90a3a (patch) | |
tree | 6257bfa05626926de3c45a32bfad48cc6c068157 /include/llfio/v2.0/path_handle.hpp | |
parent | e2434aa9d42d50651ed9685b5125f58262366081 (diff) |
symlink_handle is finished and fully working on POSIX.
Also fixed a number of vptr slicing bugs across the handle implementations, mainly caused by missing operator=() implementations.
Fixed path_handle::clone() not working on POSIX.
Diffstat (limited to 'include/llfio/v2.0/path_handle.hpp')
-rw-r--r-- | include/llfio/v2.0/path_handle.hpp | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/include/llfio/v2.0/path_handle.hpp b/include/llfio/v2.0/path_handle.hpp index 87798c04..1e308ca7 100644 --- a/include/llfio/v2.0/path_handle.hpp +++ b/include/llfio/v2.0/path_handle.hpp @@ -64,7 +64,6 @@ public: //! Default constructor constexpr path_handle() {} // NOLINT - ~path_handle() = default; //! Construct a handle from a supplied native handle explicit constexpr path_handle(native_handle_type h, caching caching = caching::all, flag flags = flag::none) : handle(h, caching, flags) @@ -77,9 +76,22 @@ public: //! No copy construction (use `clone()`) path_handle(const path_handle &) = delete; //! Move assignment permitted - path_handle &operator=(path_handle &&) = default; + path_handle &operator=(path_handle &&o) noexcept + { + this->~path_handle(); + new(this) path_handle(std::move(o)); + return *this; + } //! No copy assignment path_handle &operator=(const path_handle &) = delete; + //! Swap with another instance + LLFIO_MAKE_FREE_FUNCTION + void swap(path_handle &o) noexcept + { + path_handle temp(std::move(*this)); + *this = std::move(o); + o = std::move(temp); + } /*! Create a path handle opening access to some location on the filing system. Some operating systems provide a particularly lightweight method of doing this @@ -94,6 +106,25 @@ public: LLFIO_MAKE_FREE_FUNCTION static LLFIO_HEADERS_ONLY_MEMFUNC_SPEC result<path_handle> path(path_view_type _path) noexcept { return path(path_handle(), _path); } + LLFIO_HEADERS_ONLY_VIRTUAL_SPEC ~path_handle() override + { + if(_v) + { + (void) path_handle::close(); + } + } + LLFIO_HEADERS_ONLY_VIRTUAL_SPEC result<void> close() noexcept override + { + LLFIO_LOG_FUNCTION_CALL(this); +#ifndef NDEBUG + if(_v) + { + // Tell handle::close() that we have correctly executed + _v.behaviour |= native_handle_type::disposition::_child_close_executed; + } +#endif + return handle::close(); + } /*! Clone this handle (copy constructor is disabled to avoid accidental copying). */ result<path_handle> clone() const noexcept |