diff options
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp | 19 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h | 2 |
2 files changed, 18 insertions, 3 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp index 754ffed6ae3..d515dd73e12 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -41,9 +41,20 @@ DWARFUnit::~DWARFUnit() {} // Parses a compile unit and indexes its DIEs if it hasn't already been done. //---------------------------------------------------------------------- size_t DWARFUnit::ExtractDIEsIfNeeded(bool cu_die_only) { - const size_t initial_die_array_size = m_die_array.size(); - if ((cu_die_only && initial_die_array_size > 0) || initial_die_array_size > 1) - return 0; // Already parsed + size_t initial_die_array_size; + auto already_parsed = [cu_die_only, &initial_die_array_size, this]() -> bool { + initial_die_array_size = m_die_array.size(); + return (cu_die_only && initial_die_array_size > 0) + || initial_die_array_size > 1; + }; + { + llvm::sys::ScopedReader lock(m_extractdies_mutex); + if (already_parsed()) + return 0; + } + llvm::sys::ScopedWriter lock(m_extractdies_mutex); + if (already_parsed()) + return 0; static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); Timer scoped_timer( @@ -304,6 +315,8 @@ void DWARFUnit::SetAddrBase(dw_addr_t addr_base, void DWARFUnit::ClearDIEs(bool keep_compile_unit_die) { if (m_die_array.size() > 1) { + llvm::sys::ScopedWriter lock(m_extractdies_mutex); + // std::vectors never get any smaller when resized to a smaller size, or // when clear() or erase() are called, the size will report that it is // smaller, but the memory allocated remains intact (call capacity() to see diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h index 9be0f42ceb7..aaea60d6910 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h @@ -13,6 +13,7 @@ #include "DWARFDIE.h" #include "DWARFDebugInfoEntry.h" #include "lldb/lldb-enumerations.h" +#include "llvm/Support/RWMutex.h" class DWARFUnit; class DWARFCompileUnit; @@ -160,6 +161,7 @@ protected: // If this is a dwo compile unit this is the offset of the base compile unit // in the main object file dw_offset_t m_base_obj_offset = DW_INVALID_OFFSET; + llvm::sys::RWMutex m_extractdies_mutex; static void IndexPrivate(DWARFUnit *dwarf_cu, const lldb::LanguageType cu_language, |