Fix the ManagedStatic list ordering when using DynamicLibrary::addPermanentLibrary.
Summary: r295737 included a fix for leaking libraries loaded via. DynamicLibrary::addPermanentLibrary. This created a problem where static constructors in a library could insert llvm::ManagedStatic objects before DynamicLibrary would register it's own ManagedStatic, meaning a crash could occur at shutdown. r301562 exasperated this problem by cleaning up the DynamicLibrary ManagedStatic during llvm_shutdown. Reviewers: v.g.vassilev, lhames, efriedma Reviewed By: efriedma Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D33581 llvm-svn: 304027
This commit is contained in:
parent
fedd33f155
commit
8c3735e597
|
@ -127,10 +127,15 @@ void DynamicLibrary::AddSymbol(StringRef SymbolName, void *SymbolValue) {
|
||||||
|
|
||||||
DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *FileName,
|
DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *FileName,
|
||||||
std::string *Err) {
|
std::string *Err) {
|
||||||
SmartScopedLock<true> Lock(*SymbolsMutex);
|
// Force OpenedHandles to be added into the ManagedStatic list before any
|
||||||
|
// ManagedStatic can be added from static constructors in HandleSet::DLOpen.
|
||||||
|
HandleSet& HS = *OpenedHandles;
|
||||||
|
|
||||||
void *Handle = HandleSet::DLOpen(FileName, Err);
|
void *Handle = HandleSet::DLOpen(FileName, Err);
|
||||||
if (Handle != &Invalid)
|
if (Handle != &Invalid) {
|
||||||
OpenedHandles->AddLibrary(Handle, /*IsProcess*/ FileName == nullptr);
|
SmartScopedLock<true> Lock(*SymbolsMutex);
|
||||||
|
HS.AddLibrary(Handle, /*IsProcess*/ FileName == nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
return DynamicLibrary(Handle);
|
return DynamicLibrary(Handle);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue