From c8af9107fd1eb014d9124b753c38c4d06fa219f4 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Thu, 26 Jan 2012 04:19:04 +0000 Subject: [PATCH] In FixItRewriteToTemp::RewriteFilename don't try to close the file descriptor with close(); return it instead. Fixes mingw build and eliminates possible racing issues. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149043 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Rewrite/FixItRewriter.h | 7 ++++++- lib/Rewrite/FixItRewriter.cpp | 16 +++++++++++----- lib/Rewrite/FrontendActions.cpp | 15 ++++++++------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/include/clang/Rewrite/FixItRewriter.h b/include/clang/Rewrite/FixItRewriter.h index aeda25b24e..0ebd62c560 100644 --- a/include/clang/Rewrite/FixItRewriter.h +++ b/include/clang/Rewrite/FixItRewriter.h @@ -33,7 +33,12 @@ public: /// \brief This file is about to be rewritten. Return the name of the file /// that is okay to write to. - virtual std::string RewriteFilename(const std::string &Filename) = 0; + /// + /// \param fd out parameter for file descriptor. After the call it may be set + /// to an open file descriptor for the returned filename, or it will be -1 + /// otherwise. + /// + virtual std::string RewriteFilename(const std::string &Filename, int &fd) = 0; /// \brief Whether to abort fixing a file when not all errors could be fixed. bool FixWhatYouCan; diff --git a/lib/Rewrite/FixItRewriter.cpp b/lib/Rewrite/FixItRewriter.cpp index 51029665e4..aa57813e59 100644 --- a/lib/Rewrite/FixItRewriter.cpp +++ b/lib/Rewrite/FixItRewriter.cpp @@ -60,18 +60,24 @@ bool FixItRewriter::WriteFixedFiles( for (iterator I = buffer_begin(), E = buffer_end(); I != E; ++I) { const FileEntry *Entry = Rewrite.getSourceMgr().getFileEntryForID(I->first); - std::string Filename = FixItOpts->RewriteFilename(Entry->getName()); + int fd; + std::string Filename = FixItOpts->RewriteFilename(Entry->getName(), fd); std::string Err; - llvm::raw_fd_ostream OS(Filename.c_str(), Err, - llvm::raw_fd_ostream::F_Binary); + llvm::OwningPtr OS; + if (fd != -1) { + OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true)); + } else { + OS.reset(new llvm::raw_fd_ostream(Filename.c_str(), Err, + llvm::raw_fd_ostream::F_Binary)); + } if (!Err.empty()) { Diags.Report(clang::diag::err_fe_unable_to_open_output) << Filename << Err; continue; } RewriteBuffer &RewriteBuf = I->second; - RewriteBuf.write(OS); - OS.flush(); + RewriteBuf.write(*OS); + OS->flush(); if (RewrittenFiles) RewrittenFiles->push_back(std::make_pair(Entry->getName(), Filename)); diff --git a/lib/Rewrite/FrontendActions.cpp b/lib/Rewrite/FrontendActions.cpp index b726d76041..001a043d80 100644 --- a/lib/Rewrite/FrontendActions.cpp +++ b/lib/Rewrite/FrontendActions.cpp @@ -55,7 +55,10 @@ ASTConsumer *FixItAction::CreateASTConsumer(CompilerInstance &CI, namespace { class FixItRewriteInPlace : public FixItOptions { public: - std::string RewriteFilename(const std::string &Filename) { return Filename; } + std::string RewriteFilename(const std::string &Filename, int &fd) { + fd = -1; + return Filename; + } }; class FixItActionSuffixInserter : public FixItOptions { @@ -67,7 +70,8 @@ public: this->FixWhatYouCan = FixWhatYouCan; } - std::string RewriteFilename(const std::string &Filename) { + std::string RewriteFilename(const std::string &Filename, int &fd) { + fd = -1; llvm::SmallString<128> Path(Filename); llvm::sys::path::replace_extension(Path, NewSuffix + llvm::sys::path::extension(Path)); @@ -77,16 +81,13 @@ public: class FixItRewriteToTemp : public FixItOptions { public: - std::string RewriteFilename(const std::string &Filename) { + std::string RewriteFilename(const std::string &Filename, int &fd) { llvm::SmallString<128> Path; Path = llvm::sys::path::filename(Filename); Path += "-%%%%%%%%"; Path += llvm::sys::path::extension(Filename); - int fd; llvm::SmallString<128> NewPath; - if (llvm::sys::fs::unique_file(Path.str(), fd, NewPath) - == llvm::errc::success) - ::close(fd); + llvm::sys::fs::unique_file(Path.str(), fd, NewPath); return NewPath.str(); } }; -- 2.50.1