[gdbsupport] Add sequential_for_each
authorTom de Vries <tdevries@suse.de>
Thu, 14 Jul 2022 15:01:52 +0000 (17:01 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 14 Jul 2022 15:01:52 +0000 (17:01 +0200)
Add a sequential_for_each alongside the parallel_for_each, which can be used
as a drop-in replacement.

This can be useful when debugging multi-threading behaviour, and you want to
limit multi-threading in a fine-grained way.

Tested on x86_64-linux, by using it instead of the parallel_for_each in
dwarf2_build_psymtabs_hard.

gdbsupport/parallel-for.h

index 7b6891a0dcba9230eb4cba8a0850bda72cffc1ca..a614fc357669778c028fc5def222e7689d1d2861 100644 (file)
@@ -172,6 +172,29 @@ parallel_for_each (unsigned n, RandomIt first, RandomIt last,
     });
 }
 
+/* A sequential drop-in replacement of parallel_for_each.  This can be useful
+   when debugging multi-threading behaviour, and you want to limit
+   multi-threading in a fine-grained way.  */
+
+template<class RandomIt, class RangeFunction>
+typename gdb::detail::par_for_accumulator<
+    typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type
+  >::result_type
+sequential_for_each (unsigned n, RandomIt first, RandomIt last,
+                  RangeFunction callback)
+{
+  using result_type
+    = typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type;
+
+  gdb::detail::par_for_accumulator<result_type> results (0);
+
+  /* Process all the remaining elements in the main thread.  */
+  return results.finish ([=] ()
+    {
+      return callback (first, last);
+    });
+}
+
 }
 
 #endif /* GDBSUPPORT_PARALLEL_FOR_H */