summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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