r234612 - [Frontend] Close open file handles before renaming output files

Rafael EspĂ­ndola rafael.espindola at gmail.com
Fri Apr 10 10:37:57 PDT 2015


Thanks!

On 10 April 2015 at 13:27, Reid Kleckner <reid at kleckner.net> wrote:
> Author: rnk
> Date: Fri Apr 10 12:27:58 2015
> New Revision: 234612
>
> URL: http://llvm.org/viewvc/llvm-project?rev=234612&view=rev
> Log:
> [Frontend] Close open file handles before renaming output files
>
> The placement of the 'delete' call that was removed in the unique_ptr
> migration in r234597 was not an accident. The raw_ostream has to be
> destroyed before you do the rename on Windows, otherwise you get
> ERROR_ACCESS_DENIED. We can still use unique_ptr, we just need to do a
> manual reset().
>
> Also, range-for-loop-ify this code.
>
> Modified:
>     cfe/trunk/lib/Frontend/CompilerInstance.cpp
>
> Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=234612&r1=234611&r2=234612&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Fri Apr 10 12:27:58 2015
> @@ -524,27 +524,29 @@ void CompilerInstance::addOutputFile(Out
>  }
>
>  void CompilerInstance::clearOutputFiles(bool EraseFiles) {
> -  for (std::list<OutputFile>::iterator
> -         it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) {
> -    if (!it->TempFilename.empty()) {
> +  for (OutputFile &OF : OutputFiles) {
> +    // Manually close the stream before we rename it.
> +    OF.OS.reset();
> +
> +    if (!OF.TempFilename.empty()) {
>        if (EraseFiles) {
> -        llvm::sys::fs::remove(it->TempFilename);
> +        llvm::sys::fs::remove(OF.TempFilename);
>        } else {
> -        SmallString<128> NewOutFile(it->Filename);
> +        SmallString<128> NewOutFile(OF.Filename);
>
>          // If '-working-directory' was passed, the output filename should be
>          // relative to that.
>          FileMgr->FixupRelativePath(NewOutFile);
>          if (std::error_code ec =
> -                llvm::sys::fs::rename(it->TempFilename, NewOutFile)) {
> +                llvm::sys::fs::rename(OF.TempFilename, NewOutFile)) {
>            getDiagnostics().Report(diag::err_unable_to_rename_temp)
> -            << it->TempFilename << it->Filename << ec.message();
> +            << OF.TempFilename << OF.Filename << ec.message();
>
> -          llvm::sys::fs::remove(it->TempFilename);
> +          llvm::sys::fs::remove(OF.TempFilename);
>          }
>        }
> -    } else if (!it->Filename.empty() && EraseFiles)
> -      llvm::sys::fs::remove(it->Filename);
> +    } else if (!OF.Filename.empty() && EraseFiles)
> +      llvm::sys::fs::remove(OF.Filename);
>
>    }
>    OutputFiles.clear();
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list