Index: source/Plugins/Process/Linux/NativeProcessLinux.h =================================================================== --- source/Plugins/Process/Linux/NativeProcessLinux.h +++ source/Plugins/Process/Linux/NativeProcessLinux.h @@ -126,6 +126,8 @@ MainLoop::SignalHandleUP m_sigchld_handle; ArchSpec m_arch; + // Mutex to protect the memory region cache. + std::recursive_mutex m_memory_region_mutex; LazyBool m_supports_mem_region; std::vector> m_mem_region_cache; Index: source/Plugins/Process/Linux/NativeProcessLinux.cpp =================================================================== --- source/Plugins/Process/Linux/NativeProcessLinux.cpp +++ source/Plugins/Process/Linux/NativeProcessLinux.cpp @@ -1516,6 +1516,7 @@ Error NativeProcessLinux::GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info) { + std::lock_guard guard(m_memory_region_mutex); // FIXME review that the final memory region returned extends to the end of // the virtual address space, // with no perms if it is not mapped. @@ -2221,6 +2222,7 @@ Error NativeProcessLinux::GetLoadedModuleFileSpec(const char *module_path, FileSpec &file_spec) { + std::lock_guard guard(m_memory_region_mutex); Error error = PopulateMemoryRegionCache(); if (error.Fail()) return error; @@ -2240,6 +2242,7 @@ Error NativeProcessLinux::GetFileLoadAddress(const llvm::StringRef &file_name, lldb::addr_t &load_addr) { + std::lock_guard guard(m_memory_region_mutex); load_addr = LLDB_INVALID_ADDRESS; Error error = PopulateMemoryRegionCache(); if (error.Fail()) Index: source/Plugins/Process/NetBSD/NativeProcessNetBSD.h =================================================================== --- source/Plugins/Process/NetBSD/NativeProcessNetBSD.h +++ source/Plugins/Process/NetBSD/NativeProcessNetBSD.h @@ -106,6 +106,9 @@ private: MainLoop::SignalHandleUP m_sigchld_handle; ArchSpec m_arch; + + // Mutex to protect the memory region cache. + std::recursive_mutex m_memory_region_mutex; LazyBool m_supports_mem_region; std::vector> m_mem_region_cache; Index: source/Plugins/Process/NetBSD/NativeProcessNetBSD.cpp =================================================================== --- source/Plugins/Process/NetBSD/NativeProcessNetBSD.cpp +++ source/Plugins/Process/NetBSD/NativeProcessNetBSD.cpp @@ -565,6 +565,7 @@ Error NativeProcessNetBSD::GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info) { + std::lock_guard guard(m_memory_region_mutex); if (m_supports_mem_region == LazyBool::eLazyBoolNo) { // We're done. return Error("unsupported"); Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp =================================================================== --- source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -1440,7 +1440,6 @@ region_info.Clear(); if (m_supports_memory_region_info != eLazyBoolNo) { - m_supports_memory_region_info = eLazyBoolYes; char packet[64]; const int packet_len = ::snprintf( packet, sizeof(packet), "qMemoryRegionInfo:%" PRIx64, (uint64_t)addr); @@ -1516,6 +1515,7 @@ // We got an invalid address range back error.SetErrorString("Server returned invalid range"); } + m_supports_memory_region_info = eLazyBoolYes; } else { m_supports_memory_region_info = eLazyBoolNo; }