diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2010-03-13 21:22:49 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2010-03-13 21:22:49 +0000 |
commit | c2a981614e324fea7f0a0533f8f1d103cbd17f6d (patch) | |
tree | 07699b452b0b9064113913fcf8d21902ffdacaf7 | |
parent | b031c87ca32993fc54da732fced871bdd5b2a69e (diff) |
Revert 98439. There is a bad race condition in sys::Path::makeUnique on win32.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98452 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | tools/CIndex/CIndex.cpp | 13 | ||||
-rw-r--r-- | tools/CIndex/CIndexCodeCompletion.cpp | 8 | ||||
-rw-r--r-- | tools/CIndex/CIndexer.cpp | 6 | ||||
-rw-r--r-- | tools/CIndex/CIndexer.h | 3 |
4 files changed, 18 insertions, 12 deletions
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 594654fe6c..b52a32ed9b 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -29,6 +29,9 @@ #include "llvm/System/Program.h" #include "llvm/System/Signals.h" +// Needed to define L_TMPNAM on some systems. +#include <cstdio> + using namespace clang; using namespace clang::cxcursor; using namespace clang::cxstring; @@ -1052,8 +1055,8 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, // Generate a temporary name for the AST file. argv.push_back("-o"); - llvm::sys::Path astTmpFile(CIndexer::getTemporaryPath()); - argv.push_back(astTmpFile.c_str()); + char astTmpFile[L_tmpnam]; + argv.push_back(tmpnam(astTmpFile)); // Remap any unsaved files to temporary files. std::vector<llvm::sys::Path> TemporaryFiles; @@ -1084,7 +1087,9 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, } // Generate a temporary name for the diagnostics file. - llvm::sys::Path DiagnosticsFile(CIndexer::getTemporaryPath()); + char tmpFileResults[L_tmpnam]; + char *tmpResultsFileName = tmpnam(tmpFileResults); + llvm::sys::Path DiagnosticsFile(tmpResultsFileName); TemporaryFiles.push_back(DiagnosticsFile); argv.push_back("-fdiagnostics-binary"); @@ -1113,7 +1118,7 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, Diags->Report(diag::err_fe_invoking) << AllArgs << ErrMsg; } - ASTUnit *ATU = ASTUnit::LoadFromPCHFile(astTmpFile.str(), *Diags, + ASTUnit *ATU = ASTUnit::LoadFromPCHFile(astTmpFile, *Diags, CXXIdx->getOnlyLocalDecls(), RemappedFiles.data(), RemappedFiles.size(), diff --git a/tools/CIndex/CIndexCodeCompletion.cpp b/tools/CIndex/CIndexCodeCompletion.cpp index cd3787204c..3b7674ec0d 100644 --- a/tools/CIndex/CIndexCodeCompletion.cpp +++ b/tools/CIndex/CIndexCodeCompletion.cpp @@ -299,11 +299,15 @@ CXCodeCompleteResults *clang_codeComplete(CXIndex CIdx, argv.push_back(NULL); // Generate a temporary name for the code-completion results file. - llvm::sys::Path ResultsFile(CIndexer::getTemporaryPath()); + char tmpFile[L_tmpnam]; + char *tmpFileName = tmpnam(tmpFile); + llvm::sys::Path ResultsFile(tmpFileName); TemporaryFiles.push_back(ResultsFile); // Generate a temporary name for the diagnostics file. - llvm::sys::Path DiagnosticsFile(CIndexer::getTemporaryPath()); + char tmpFileResults[L_tmpnam]; + char *tmpResultsFileName = tmpnam(tmpFileResults); + llvm::sys::Path DiagnosticsFile(tmpResultsFileName); TemporaryFiles.push_back(DiagnosticsFile); // Invoke 'clang'. diff --git a/tools/CIndex/CIndexer.cpp b/tools/CIndex/CIndexer.cpp index 3cc1af8e14..0774ae2f37 100644 --- a/tools/CIndex/CIndexer.cpp +++ b/tools/CIndex/CIndexer.cpp @@ -95,7 +95,7 @@ std::string CIndexer::getClangResourcesPath() { return P.str(); } -llvm::sys::Path CIndexer::getTemporaryPath() { +static llvm::sys::Path GetTemporaryPath() { // FIXME: This is lame; sys::Path should provide this function (in particular, // it should know how to find the temporary files dir). std::string Error; @@ -107,7 +107,7 @@ llvm::sys::Path CIndexer::getTemporaryPath() { if (!TmpDir) TmpDir = "/tmp"; llvm::sys::Path P(TmpDir); - P.appendComponent("CIndex"); + P.appendComponent("remap"); if (P.makeUnique(false, &Error)) return llvm::sys::Path(""); @@ -123,7 +123,7 @@ bool clang::RemapFiles(unsigned num_unsaved_files, std::vector<llvm::sys::Path> &TemporaryFiles) { for (unsigned i = 0; i != num_unsaved_files; ++i) { // Write the contents of this unsaved file into the temporary file. - llvm::sys::Path SavedFile(CIndexer::getTemporaryPath()); + llvm::sys::Path SavedFile(GetTemporaryPath()); if (SavedFile.empty()) return true; diff --git a/tools/CIndex/CIndexer.h b/tools/CIndex/CIndexer.h index 80337a272d..1fa3ca9387 100644 --- a/tools/CIndex/CIndexer.h +++ b/tools/CIndex/CIndexer.h @@ -64,9 +64,6 @@ public: /// \brief Get the path of the clang resource files. std::string getClangResourcesPath(); - - /// \brief Get an unique temporary filename. - static llvm::sys::Path getTemporaryPath(); }; namespace clang { |