summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2012-07-12 01:11:40 +0000
committerSean Callanan <scallanan@apple.com>2012-07-12 01:11:40 +0000
commit7d69f12e75cf1816964f6e51d7d7400c99d0be99 (patch)
tree41205084b88657183d82fd2a656744d6d28c8d91
parentd2aabd3bb2c8114bc143176a6e30a7e6d2b6d746 (diff)
downloadbcm5719-llvm-7d69f12e75cf1816964f6e51d7d7400c99d0be99.tar.gz
bcm5719-llvm-7d69f12e75cf1816964f6e51d7d7400c99d0be99.zip
Added a mutex to the call frame info to guard
generation of the FDE index. <rdar://problem/11813705> llvm-svn: 160099
-rw-r--r--lldb/include/lldb/Symbol/DWARFCallFrameInfo.h2
-rw-r--r--lldb/source/Symbol/DWARFCallFrameInfo.cpp7
2 files changed, 8 insertions, 1 deletions
diff --git a/lldb/include/lldb/Symbol/DWARFCallFrameInfo.h b/lldb/include/lldb/Symbol/DWARFCallFrameInfo.h
index 75a9f19f62c..c878ea91245 100644
--- a/lldb/include/lldb/Symbol/DWARFCallFrameInfo.h
+++ b/lldb/include/lldb/Symbol/DWARFCallFrameInfo.h
@@ -18,6 +18,7 @@
#include "lldb/Core/AddressRange.h"
#include "lldb/Core/VMRange.h"
#include "lldb/Core/dwarf.h"
+#include "lldb/Host/Mutex.h"
#include "lldb/Symbol/UnwindPlan.h"
#include "lldb/Symbol/ObjectFile.h"
@@ -128,6 +129,7 @@ private:
std::vector<FDEEntry> m_fde_index;
bool m_fde_index_initialized; // only scan the section for FDEs once
+ Mutex m_fde_index_mutex; // and isolate the thread that does it
bool m_is_eh_frame;
diff --git a/lldb/source/Symbol/DWARFCallFrameInfo.cpp b/lldb/source/Symbol/DWARFCallFrameInfo.cpp
index b8e8cde7151..edc6d151f04 100644
--- a/lldb/source/Symbol/DWARFCallFrameInfo.cpp
+++ b/lldb/source/Symbol/DWARFCallFrameInfo.cpp
@@ -293,9 +293,14 @@ DWARFCallFrameInfo::GetFDEIndex ()
{
if (m_section_sp.get() == NULL || m_section_sp->IsEncrypted())
return;
+
if (m_fde_index_initialized)
return;
-
+
+ Mutex::Locker locker(m_fde_index_mutex);
+
+ if (m_fde_index_initialized) // if two threads hit the locker
+ return;
dw_offset_t offset = 0;
if (m_cfi_data_initialized == false)
OpenPOWER on IntegriCloud