[Lldb-commits] [lldb] DynamicLoaderDarwin load images in parallel with preload (PR #110646)

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 14 16:00:01 PDT 2024


================
@@ -642,26 +652,86 @@ ModuleSP DynamicLoaderDarwin::GetDYLDModule() {
 
 void DynamicLoaderDarwin::ClearDYLDModule() { m_dyld_module_wp.reset(); }
 
+template <typename InputIterator, typename ResultType>
+static std::vector<ResultType> parallel_map(
+    llvm::ThreadPoolInterface &threadPool, InputIterator first,
+    InputIterator last,
+    llvm::function_ref<ResultType(
+        const typename std::iterator_traits<InputIterator>::value_type &)>
+        transform) {
+  const auto size = std::distance(first, last);
+  std::vector<ResultType> results(size);
+  if (size > 0) {
+    llvm::ThreadPoolTaskGroup taskGroup(threadPool);
+    auto it = first;
+    for (ssize_t i = 0; i < size; ++i, ++it) {
+      taskGroup.async([&, i, it]() { results[i] = transform(*it); });
+    }
+    taskGroup.wait();
+  }
+  return results;
+}
----------------
JDevlieghere wrote:

I personally think the new code, even with the little bit of code duplication, reads a lot easier than the templated signature of the `(parallel_)map` functions. I personally wouldn't bother with the `size > 0` check (I expect that creating an empty task group and waiting on an empty task group is essentially free). Anyway, I don't feel super strongly about it, so go with whatever you think is best. 

FWIW I don't expect us to ever migrate this code to `std::transform` because we definitely want to limit the parallelism by using the debugger's thread pool. 

https://github.com/llvm/llvm-project/pull/110646


More information about the lldb-commits mailing list