mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 09:13:38 +08:00
Fixed a race condition in PrecompiledPreamble.
Summary: Two PrecompiledPreambles, used in parallel on separate threads, could be writing preamble to the same temporary file. Reviewers: bkramer, krasimir, klimek Reviewed By: klimek Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D36529 llvm-svn: 310618
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Mutex.h"
|
||||
#include "llvm/Support/MutexGuard.h"
|
||||
#include "llvm/Support/Process.h"
|
||||
|
||||
using namespace clang;
|
||||
|
||||
@@ -462,9 +463,16 @@ llvm::ErrorOr<PrecompiledPreamble::TempPCHFile>
|
||||
PrecompiledPreamble::TempPCHFile::createInSystemTempDir(const Twine &Prefix,
|
||||
StringRef Suffix) {
|
||||
llvm::SmallString<64> File;
|
||||
auto EC = llvm::sys::fs::createTemporaryFile(Prefix, Suffix, /*ref*/ File);
|
||||
// Using a version of createTemporaryFile with a file descriptor guarantees
|
||||
// that we would never get a race condition in a multi-threaded setting (i.e.,
|
||||
// multiple threads getting the same temporary path).
|
||||
int FD;
|
||||
auto EC = llvm::sys::fs::createTemporaryFile(Prefix, Suffix, /*ref*/ FD,
|
||||
/*ref*/ File);
|
||||
if (EC)
|
||||
return EC;
|
||||
// We only needed to make sure the file exists, close the file right away.
|
||||
llvm::sys::Process::SafelyCloseFileDescriptor(FD);
|
||||
return TempPCHFile(std::move(File).str());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user