Author: jkorous Date: Fri Sep 13 13:08:27 2019 New Revision: 371890 URL: http://llvm.org/viewvc/llvm-project?rev=371890&view=rev Log: [Support] Add overload writeFileAtomically(std::function Writer)
Differential Revision: https://reviews.llvm.org/D67424 Modified: clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp Modified: clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp?rev=371890&r1=371889&r2=371890&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp (original) +++ clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp Fri Sep 13 13:08:27 2019 @@ -18,6 +18,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/FileUtilities.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" #include <functional> @@ -35,34 +36,6 @@ std::string getShardPathFromFilePath(llv return ShardRootSS.str(); } -llvm::Error -writeAtomically(llvm::StringRef OutPath, - llvm::function_ref<void(llvm::raw_ostream &)> Writer) { - // Write to a temporary file first. - llvm::SmallString<128> TempPath; - int FD; - auto EC = - llvm::sys::fs::createUniqueFile(OutPath + ".tmp.%%%%%%%%", FD, TempPath); - if (EC) - return llvm::errorCodeToError(EC); - // Make sure temp file is destroyed on failure. - auto RemoveOnFail = - llvm::make_scope_exit([TempPath] { llvm::sys::fs::remove(TempPath); }); - llvm::raw_fd_ostream OS(FD, /*shouldClose=*/true); - Writer(OS); - OS.close(); - if (OS.has_error()) - return llvm::errorCodeToError(OS.error()); - // Then move to real location. - EC = llvm::sys::fs::rename(TempPath, OutPath); - if (EC) - return llvm::errorCodeToError(EC); - // If everything went well, we already moved the file to another name. So - // don't delete the file, as the name might be taken by another file. - RemoveOnFail.release(); - return llvm::ErrorSuccess(); -} - // Uses disk as a storage for index shards. Creates a directory called // ".clangd/index/" under the path provided during construction. class DiskBackedIndexStorage : public BackgroundIndexStorage { @@ -100,9 +73,12 @@ public: llvm::Error storeShard(llvm::StringRef ShardIdentifier, IndexFileOut Shard) const override { - return writeAtomically( - getShardPathFromFilePath(DiskShardRoot, ShardIdentifier), - [&Shard](llvm::raw_ostream &OS) { OS << Shard; }); + auto ShardPath = getShardPathFromFilePath(DiskShardRoot, ShardIdentifier); + return llvm::writeFileAtomically(ShardPath + ".tmp.%%%%%%%%", ShardPath, + [&Shard](llvm::raw_ostream &OS) { + OS << Shard; + return llvm::Error::success(); + }); } }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits