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