llunak updated this revision to Diff 420492. llunak retitled this revision from "parallelize module loading in DynamicLoaderPOSIXDYLD()" to "parallelize calling of Module::PreloadSymbols()". llunak edited the summary of this revision. llunak added a reviewer: jingham. llunak added a comment.
Ok, parallelizing of only Module::PreloadSymbols() was simpler than I expected and it also works, so I've reworked the patch to do that. This change now requires D123128 <https://reviews.llvm.org/D123128> and also adding the grouping ability to ThreadPool, which I haven't done yet. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D122975/new/ https://reviews.llvm.org/D122975 Files: lldb/source/Target/Target.cpp Index: lldb/source/Target/Target.cpp =================================================================== --- lldb/source/Target/Target.cpp +++ lldb/source/Target/Target.cpp @@ -62,6 +62,7 @@ #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/SetVector.h" +#include "llvm/Support/ThreadPool.h" #include <memory> #include <mutex> @@ -1623,6 +1624,17 @@ void Target::ModulesDidLoad(ModuleList &module_list) { const size_t num_images = module_list.GetSize(); if (m_valid && num_images) { + if (GetPreloadSymbols()) { + // Try to preload symbols in parallel. + llvm::ThreadPool pool(llvm::optimal_concurrency(num_images)); + auto preload_symbols_fn = [&](size_t idx) { + ModuleSP module_sp(module_list.GetModuleAtIndex(idx)); + module_sp->PreloadSymbols(); + }; + for (size_t idx = 0; idx < num_images; ++idx) + pool.async(preload_symbols_fn, idx); + pool.wait(); + } for (size_t idx = 0; idx < num_images; ++idx) { ModuleSP module_sp(module_list.GetModuleAtIndex(idx)); LoadScriptingResourceForModule(module_sp, this); @@ -2170,11 +2182,6 @@ }); } - // Preload symbols outside of any lock, so hopefully we can do this for - // each library in parallel. - if (GetPreloadSymbols()) - module_sp->PreloadSymbols(); - llvm::SmallVector<ModuleSP, 1> replaced_modules; for (ModuleSP &old_module_sp : old_modules) { if (m_images.GetIndexForModule(old_module_sp.get()) !=
Index: lldb/source/Target/Target.cpp =================================================================== --- lldb/source/Target/Target.cpp +++ lldb/source/Target/Target.cpp @@ -62,6 +62,7 @@ #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/SetVector.h" +#include "llvm/Support/ThreadPool.h" #include <memory> #include <mutex> @@ -1623,6 +1624,17 @@ void Target::ModulesDidLoad(ModuleList &module_list) { const size_t num_images = module_list.GetSize(); if (m_valid && num_images) { + if (GetPreloadSymbols()) { + // Try to preload symbols in parallel. + llvm::ThreadPool pool(llvm::optimal_concurrency(num_images)); + auto preload_symbols_fn = [&](size_t idx) { + ModuleSP module_sp(module_list.GetModuleAtIndex(idx)); + module_sp->PreloadSymbols(); + }; + for (size_t idx = 0; idx < num_images; ++idx) + pool.async(preload_symbols_fn, idx); + pool.wait(); + } for (size_t idx = 0; idx < num_images; ++idx) { ModuleSP module_sp(module_list.GetModuleAtIndex(idx)); LoadScriptingResourceForModule(module_sp, this); @@ -2170,11 +2182,6 @@ }); } - // Preload symbols outside of any lock, so hopefully we can do this for - // each library in parallel. - if (GetPreloadSymbols()) - module_sp->PreloadSymbols(); - llvm::SmallVector<ModuleSP, 1> replaced_modules; for (ModuleSP &old_module_sp : old_modules) { if (m_images.GetIndexForModule(old_module_sp.get()) !=
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits