diff --git a/lldb/source/Plugins/Process/Linux/Procfs.cpp b/lldb/source/Plugins/Process/Linux/Procfs.cpp --- a/lldb/source/Plugins/Process/Linux/Procfs.cpp +++ b/lldb/source/Plugins/Process/Linux/Procfs.cpp @@ -9,7 +9,9 @@ #include "Procfs.h" #include "lldb/Host/linux/Support.h" + #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Threading.h" using namespace lldb; using namespace lldb_private; @@ -17,17 +19,18 @@ using namespace llvm; Expected> lldb_private::process_linux::GetProcfsCpuInfo() { - static Optional> cpu_info; - if (!cpu_info) { - auto buffer_or_error = errorOrToExpected(getProcFile("cpuinfo")); - if (!buffer_or_error) - return buffer_or_error.takeError(); - MemoryBuffer &buffer = **buffer_or_error; - cpu_info = std::vector( - reinterpret_cast(buffer.getBufferStart()), - reinterpret_cast(buffer.getBufferEnd())); - } - return *cpu_info; + static Optional>> cpu_info_or_err; + static llvm::once_flag g_once_flag; + + llvm::call_once(g_once_flag, + [] { cpu_info_or_err = getProcFile("cpuinfo"); }); + if (!*cpu_info_or_err) + cpu_info_or_err->getError(); + + MemoryBuffer &buffer = ***cpu_info_or_err; + return ArrayRef( + reinterpret_cast(buffer.getBufferStart()), + reinterpret_cast(buffer.getBufferEnd())); } Expected>