summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp')
-rw-r--r--clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp38
1 files changed, 7 insertions, 31 deletions
diff --git a/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp b/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
index 86c73ff7420..48510e11e84 100644
--- a/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
+++ b/clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
@@ -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(llvm::StringRef ShardRoot,
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();
+ });
}
};
OpenPOWER on IntegriCloud