From: Benjamin Kramer Date: Sat, 13 Mar 2010 21:22:49 +0000 (+0000) Subject: Revert 98439. There is a bad race condition in sys::Path::makeUnique on win32. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c2a981614e324fea7f0a0533f8f1d103cbd17f6d;p=clang 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 --- 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 + 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 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 &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 {