]> granicus.if.org Git - clang/commitdiff
In FixItRewriteToTemp::RewriteFilename don't try to close the file descriptor
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 26 Jan 2012 04:19:04 +0000 (04:19 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 26 Jan 2012 04:19:04 +0000 (04:19 +0000)
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
lib/Rewrite/FixItRewriter.cpp
lib/Rewrite/FrontendActions.cpp

index aeda25b24e25daa4da80f5c2686acd6ea255271a..0ebd62c560f474c5101bddaa6cbbef90079c03d9 100644 (file)
@@ -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;
index 51029665e47e3276982b146a5fa21858a1f88259..aa57813e5982a5888bb86ff561d58944194eb79d 100644 (file)
@@ -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<llvm::raw_fd_ostream> 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));
index b726d7604138fce4b92b2e0eb06275859ff79b68..001a043d803a9f2034c06c0092638026b011cfb1 100644 (file)
@@ -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();
   }
 };