diff options
author | Jim Ingham <jingham@apple.com> | 2012-05-30 02:19:25 +0000 |
---|---|---|
committer | Jim Ingham <jingham@apple.com> | 2012-05-30 02:19:25 +0000 |
commit | 3ee12ef26ed534af3d0c85f88df7b06db037bfe3 (patch) | |
tree | 9d46961f3981c27e927926a4ea7d5a2c2b0b6ba7 /lldb/source/Target/Process.cpp | |
parent | 13586ab6d8a1c9f373315a70c384f67089c2371e (diff) | |
download | bcm5719-llvm-3ee12ef26ed534af3d0c85f88df7b06db037bfe3.tar.gz bcm5719-llvm-3ee12ef26ed534af3d0c85f88df7b06db037bfe3.zip |
We were accessing the ModuleList in the target without locking it for tasks like
setting breakpoints. That's dangerous, since while we are setting a breakpoint,
the target might hit the dyld load notification, and start removing modules from
the list. This change adds a GetMutex accessor to the ModuleList class, and
uses it whenever we are accessing the target's ModuleList (as returned by GetImages().)
<rdar://problem/11552372>
llvm-svn: 157668
Diffstat (limited to 'lldb/source/Target/Process.cpp')
-rw-r--r-- | lldb/source/Target/Process.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 832feaac9ae..64626a97a7e 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -2814,19 +2814,23 @@ Process::CompleteAttach () m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); // Figure out which one is the executable, and set that in our target: - ModuleList &modules = m_target.GetImages(); + ModuleList &target_modules = m_target.GetImages(); + Mutex::Locker modules_locker(target_modules.GetMutex()); + size_t num_modules = target_modules.GetSize(); + ModuleSP new_executable_module_sp; - size_t num_modules = modules.GetSize(); for (int i = 0; i < num_modules; i++) { - ModuleSP module_sp (modules.GetModuleAtIndex(i)); + ModuleSP module_sp (target_modules.GetModuleAtIndexUnlocked (i)); if (module_sp && module_sp->IsExecutable()) { if (m_target.GetExecutableModulePointer() != module_sp.get()) - m_target.SetExecutableModule (module_sp, false); + new_executable_module_sp = module_sp; break; } } + if (new_executable_module_sp) + m_target.SetExecutableModule (new_executable_module_sp, false); } Error |