]> granicus.if.org Git - llvm/commit
Support: Rewrite Windows implementation of sys::fs::rename to be more POSIXy.
authorPeter Collingbourne <peter@pcc.me.uk>
Fri, 6 Oct 2017 17:14:36 +0000 (17:14 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Fri, 6 Oct 2017 17:14:36 +0000 (17:14 +0000)
commit1b6a51a1425cc0180359ecd64733edb965f65d7c
tree1e18bf42355e9fb799b933cec3a0ff8d3d71e295
parent01343e961e79d0396042335dcda5938af5311e6a
Support: Rewrite Windows implementation of sys::fs::rename to be more POSIXy.

The current implementation of rename uses ReplaceFile if the
destination file already exists. According to the documentation for
ReplaceFile, the source file is opened without a sharing mode. This
means that there is a short interval of time between when ReplaceFile
renames the file and when it closes the file during which the
destination file cannot be opened.

This behaviour is not POSIX compliant because rename is supposed
to be atomic. It was also causing intermittent link failures when
linking with a ThinLTO cache; the ThinLTO cache implementation expects
all cache files to be openable.

This patch addresses that problem by re-implementing rename
using CreateFile and SetFileInformationByHandle. It is roughly a
reimplementation of ReplaceFile with a better sharing policy as well
as support for renaming in the case where the destination file does
not exist.

This implementation is still not fully POSIX. Specifically in the case
where the destination file is open at the point when rename is called,
there will be a short interval of time during which the destination
file will not exist. It isn't clear whether it is possible to avoid
this using the Windows API.

Differential Revision: https://reviews.llvm.org/D38570

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315079 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Support/FileSystem.h
lib/Support/Windows/Path.inc
unittests/Support/ReplaceFileTest.cpp