aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2022-07-14 17:01:52 +0200
committerTom de Vries <tdevries@suse.de>2022-07-14 17:01:52 +0200
commit18a5766d09c262878018af26ecbada38d7262b4d (patch)
tree2f6ea5678f09fcde5ad091fe4033a2ed960082ac
parente24500cbab783d42656d3b745947c98d7d5bdd83 (diff)
downloadgdb-18a5766d09c262878018af26ecbada38d7262b4d.zip
gdb-18a5766d09c262878018af26ecbada38d7262b4d.tar.gz
gdb-18a5766d09c262878018af26ecbada38d7262b4d.tar.bz2
[gdbsupport] Add sequential_for_each
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.
-rw-r--r--gdbsupport/parallel-for.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/gdbsupport/parallel-for.h b/gdbsupport/parallel-for.h
index 7b6891a..a614fc3 100644
--- a/gdbsupport/parallel-for.h
+++ b/gdbsupport/parallel-for.h
@@ -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 */