diff options
author | sath <[email protected]> | 2024-05-25 20:09:56 +0300 |
---|---|---|
committer | sath <[email protected]> | 2024-05-25 20:23:52 +0300 |
commit | 981459b64021aeee8e80fbed0fd0d9b205adbd32 (patch) | |
tree | bb4630777f5b5337760b545c68360fd797018b07 /contrib/libs/cxxsupp/libcxx/src/filesystem | |
parent | c981104c914df8a13dd4fc7393a2c83b992d4f19 (diff) |
Add caching file attributes for directory_iterator.
Will be upstreamed in/ https://github.com/llvm/llvm-project/pull/93316
c8062150c5a7da5f056ef6edbaf5dd8c76020903
Diffstat (limited to 'contrib/libs/cxxsupp/libcxx/src/filesystem')
-rw-r--r-- | contrib/libs/cxxsupp/libcxx/src/filesystem/directory_iterator.cpp | 10 | ||||
-rw-r--r-- | contrib/libs/cxxsupp/libcxx/src/filesystem/file_descriptor.h | 15 |
2 files changed, 15 insertions, 10 deletions
diff --git a/contrib/libs/cxxsupp/libcxx/src/filesystem/directory_iterator.cpp b/contrib/libs/cxxsupp/libcxx/src/filesystem/directory_iterator.cpp index 151fb2fb621..cf9d63196e6 100644 --- a/contrib/libs/cxxsupp/libcxx/src/filesystem/directory_iterator.cpp +++ b/contrib/libs/cxxsupp/libcxx/src/filesystem/directory_iterator.cpp @@ -80,14 +80,12 @@ public: bool assign() { if (!wcscmp(__data_.cFileName, L".") || !wcscmp(__data_.cFileName, L"..")) return false; - // FIXME: Cache more of this - //directory_entry::__cached_data cdata; - //cdata.__type_ = get_file_type(__data_); - //cdata.__size_ = get_file_size(__data_); - //cdata.__write_time_ = get_write_time(__data_); __entry_.__assign_iter_entry( __root_ / __data_.cFileName, - directory_entry::__create_iter_result(detail::get_file_type(__data_))); + directory_entry::__create_iter_cached_result(detail::get_file_type(__data_), + detail::get_file_size(__data_), + detail::get_file_perm(__data_), + detail::get_write_time(__data_))); return true; } diff --git a/contrib/libs/cxxsupp/libcxx/src/filesystem/file_descriptor.h b/contrib/libs/cxxsupp/libcxx/src/filesystem/file_descriptor.h index d3a668fa2e3..7bc0a4d1788 100644 --- a/contrib/libs/cxxsupp/libcxx/src/filesystem/file_descriptor.h +++ b/contrib/libs/cxxsupp/libcxx/src/filesystem/file_descriptor.h @@ -99,11 +99,18 @@ inline uintmax_t get_file_size(const WIN32_FIND_DATAW& data) { return (static_cast<uint64_t>(data.nFileSizeHigh) << 32) + data.nFileSizeLow; } inline file_time_type get_write_time(const WIN32_FIND_DATAW& data) { - ULARGE_INTEGER tmp; + using detail::fs_time; const FILETIME& time = data.ftLastWriteTime; - tmp.u.LowPart = time.dwLowDateTime; - tmp.u.HighPart = time.dwHighDateTime; - return file_time_type(file_time_type::duration(tmp.QuadPart)); + auto ts = filetime_to_timespec(time); + if (!fs_time::is_representable(ts)) + return file_time_type::min(); + return fs_time::convert_from_timespec(ts); +} +inline perms get_file_perm(const WIN32_FIND_DATAW& data) { + unsigned st_mode = 0555; // Read-only + if (!(data.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + st_mode |= 0222; // Write + return static_cast<perms>(st_mode) & perms::mask; } #endif // !_LIBCPP_WIN32API |