Fixed an issue that could happen during global object destruction in our

map that tracks all live Module classes. We must leak our mutex for our
collection class as it might be destroyed in an order we can't control.

llvm-svn: 149131
This commit is contained in:
Greg Clayton 2012-01-27 18:08:35 +00:00
parent f519564d7c
commit b26e6bebac
3 changed files with 14 additions and 7 deletions

View File

@ -64,7 +64,7 @@ public:
static Module *
GetAllocatedModuleAtIndex (size_t idx);
static Mutex &
static Mutex *
GetAllocationModuleCollectionMutex();
//------------------------------------------------------------------

View File

@ -1632,7 +1632,7 @@ FindModulesByName (Target *target,
if (check_global_list && num_matches == 0)
{
// Check the global list
Mutex::Locker locker(Module::GetAllocationModuleCollectionMutex().GetMutex());
Mutex::Locker locker(Module::GetAllocationModuleCollectionMutex());
const uint32_t num_modules = Module::GetNumberAllocatedModules();
ModuleSP module_sp;
for (uint32_t image_idx = 0; image_idx<num_modules; ++image_idx)
@ -2051,7 +2051,7 @@ public:
else
{
// Check the global list
Mutex::Locker locker(Module::GetAllocationModuleCollectionMutex().GetMutex());
Mutex::Locker locker(Module::GetAllocationModuleCollectionMutex());
result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
}
@ -2785,7 +2785,7 @@ public:
if (use_global_module_list)
{
locker.Reset (Module::GetAllocationModuleCollectionMutex().GetMutex());
locker.Reset (Module::GetAllocationModuleCollectionMutex()->GetMutex());
num_modules = Module::GetNumberAllocatedModules();
}
else

View File

@ -43,11 +43,18 @@ GetModuleCollection()
return *g_module_collection;
}
Mutex &
Mutex *
Module::GetAllocationModuleCollectionMutex()
{
static Mutex g_module_collection_mutex(Mutex::eMutexTypeRecursive);
return g_module_collection_mutex;
// NOTE: The mutex below must be leaked since the global module list in
// the ModuleList class will get torn at some point, and we can't know
// if it will tear itself down before the "g_module_collection_mutex" below
// will. So we leak a Mutex object below to safeguard against that
static Mutex *g_module_collection_mutex = NULL;
if (g_module_collection_mutex == NULL)
g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak
return g_module_collection_mutex;
}
size_t