Fix a problem with llvm-ranlib that (on some platforms) caused the archive

file to become corrupted due to interactions between mmap'd memory segments
and file descriptors closing. The problem is completely avoiding by using
a third temporary file.

Patch provided by Evan Jones


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24527 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Spencer
2005-11-30 05:21:10 +00:00
parent 5b9bbc8792
commit 6ff7240a5c
6 changed files with 177 additions and 72 deletions

View File

@ -140,13 +140,28 @@ Archive::Archive(const sys::Path& filename, bool map )
}
}
// Archive destructor - just clean up memory
Archive::~Archive() {
void Archive::cleanUpMemory() {
// Shutdown the file mapping
if (mapfile) {
mapfile->close();
delete mapfile;
mapfile = 0;
base = 0;
}
// Forget the entire symbol table
symTab.clear();
symTabSize = 0;
firstFileOffset = 0;
// Free the foreign symbol table member
if (foreignST) {
delete foreignST;
foreignST = 0;
}
// Delete any ModuleProviders and ArchiveMember's we've allocated as a result
// of symbol table searches.
for (ModuleMap::iterator I=modules.begin(), E=modules.end(); I != E; ++I ) {
@ -155,3 +170,8 @@ Archive::~Archive() {
}
}
// Archive destructor - just clean up memory
Archive::~Archive() {
cleanUpMemory();
}