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 | f156b9d55dd4cc4aebeb418449c2a09df10dbb99 (patch) | |
| tree | 88917a8a99106a4bc6888b7fcfa77e7cc5a8d0a0 | |
| parent | 29bdac4928c417f25670e462ca55ffbd68a4f11b (diff) | |
| download | bcm5719-llvm-f156b9d55dd4cc4aebeb418449c2a09df10dbb99.tar.gz bcm5719-llvm-f156b9d55dd4cc4aebeb418449c2a09df10dbb99.zip | |
Revert 98439. There is a bad race condition in sys::Path::makeUnique on win32.
llvm-svn: 98452
| -rw-r--r-- | clang/tools/CIndex/CIndex.cpp | 13 | ||||
| -rw-r--r-- | clang/tools/CIndex/CIndexCodeCompletion.cpp | 8 | ||||
| -rw-r--r-- | clang/tools/CIndex/CIndexer.cpp | 6 | ||||
| -rw-r--r-- | clang/tools/CIndex/CIndexer.h | 3 |
4 files changed, 18 insertions, 12 deletions
diff --git a/clang/tools/CIndex/CIndex.cpp b/clang/tools/CIndex/CIndex.cpp index 594654fe6c6..b52a32ed9b5 100644 --- a/clang/tools/CIndex/CIndex.cpp +++ b/clang/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/clang/tools/CIndex/CIndexCodeCompletion.cpp b/clang/tools/CIndex/CIndexCodeCompletion.cpp index cd3787204cb..3b7674ec0d1 100644 --- a/clang/tools/CIndex/CIndexCodeCompletion.cpp +++ b/clang/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/clang/tools/CIndex/CIndexer.cpp b/clang/tools/CIndex/CIndexer.cpp index 3cc1af8e144..0774ae2f372 100644 --- a/clang/tools/CIndex/CIndexer.cpp +++ b/clang/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/clang/tools/CIndex/CIndexer.h b/clang/tools/CIndex/CIndexer.h index 80337a272d0..1fa3ca93876 100644 --- a/clang/tools/CIndex/CIndexer.h +++ b/clang/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 { |

