Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/windirstat/llfio.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiall Douglas (s [underscore] sourceforge {at} nedprod [dot] com) <spamtrap@nedprod.com>2018-08-14 22:05:04 +0300
committerNiall Douglas (s [underscore] sourceforge {at} nedprod [dot] com) <spamtrap@nedprod.com>2018-08-14 22:05:04 +0300
commit83b7ad9bfda9af36414d8d6acac454288cb90a3a (patch)
tree6257bfa05626926de3c45a32bfad48cc6c068157 /include/llfio/v2.0/path_handle.hpp
parente2434aa9d42d50651ed9685b5125f58262366081 (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.hpp35
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