[PATCH] D38715: Support: On Windows, speculatively call DeleteFileW from sys::fs::remove().

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 9 21:53:27 PDT 2017


This makes the case of removing a file faster, but removing a directory
slower, because you’ve essentially got 2 stats for a directory.

It may be possible to knock all of this out in one call.

Can you try calling CreateFile with

FILE_FLAG_OPEN_REPARSE_POINT // Don’t follow symlinks
| FILE_FLAG_BACKUP_SEMANTICS // Allow opening a directory
| FILE_FLAG_DELETE_ON_CLOSE // Delete it

Not sure if the last two options can be used together, but seems worth a try

On Mon, Oct 9, 2017 at 9:35 PM Peter Collingbourne via Phabricator <
reviews at reviews.llvm.org> wrote:

> pcc created this revision.
> Herald added a subscriber: hiraditya.
>
> This saves a call to stat().
>
>
> https://reviews.llvm.org/D38715
>
> Files:
>   llvm/lib/Support/Windows/Path.inc
>
>
> Index: llvm/lib/Support/Windows/Path.inc
> ===================================================================
> --- llvm/lib/Support/Windows/Path.inc
> +++ llvm/lib/Support/Windows/Path.inc
> @@ -259,26 +259,21 @@
>  std::error_code remove(const Twine &path, bool IgnoreNonExisting) {
>    SmallVector<wchar_t, 128> path_utf16;
>
> -  file_status ST;
> -  if (std::error_code EC = status(path, ST)) {
> -    if (EC != errc::no_such_file_or_directory || !IgnoreNonExisting)
> -      return EC;
> -    return std::error_code();
> -  }
> -
>    if (std::error_code ec = widenPath(path, path_utf16))
>      return ec;
>
> -  if (ST.type() == file_type::directory_file) {
> -    if (!::RemoveDirectoryW(c_str(path_utf16))) {
> -      std::error_code EC = mapWindowsError(::GetLastError());
> -      if (EC != errc::no_such_file_or_directory || !IgnoreNonExisting)
> -        return EC;
> -    }
> -    return std::error_code();
> -  }
> +  // Speculate that the path is actually a file in order to save a stat()
> call.
>    if (!::DeleteFileW(c_str(path_utf16))) {
>      std::error_code EC = mapWindowsError(::GetLastError());
> +    if (EC == errc::permission_denied) {
> +      if (!::RemoveDirectoryW(c_str(path_utf16))) {
> +        std::error_code EC = mapWindowsError(::GetLastError());
> +        if (EC != errc::no_such_file_or_directory || !IgnoreNonExisting)
> +          return EC;
> +      }
> +      return std::error_code();
> +    }
> +
>      if (EC != errc::no_such_file_or_directory || !IgnoreNonExisting)
>        return EC;
>    }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171010/c5247f21/attachment.html>


More information about the llvm-commits mailing list