From: Tom de Vries Date: Fri, 15 Jul 2022 10:42:31 +0000 (+0200) Subject: [gdb/symtab] Use parallel_for_each in process_queue X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=060f7c545b27007945431ed5f6aa10d659d7baa6;p=thirdparty%2Fbinutils-gdb.git [gdb/symtab] Use parallel_for_each in process_queue Do the parallelization. --- diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index cf44996b8e6..82fdf4cd5c3 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -7621,15 +7621,36 @@ process_queue (dwarf2_per_objfile *per_objfile) dwarf_read_debug_printf ("Expanding one or more symtabs of objfile %s ...", objfile_name (per_objfile->objfile)); + using iter_type = decltype (per_objfile->queue->begin ()); + using result_type = int; + /* The queue starts out with one item, but following a DIE reference may load a new CU, adding it to the end of the queue. */ while (!per_objfile->queue->empty ()) { - dwarf2_queue_item &item = per_objfile->queue->front (); - process_queue_item (per_objfile, item); - dwarf2_per_cu_data *per_cu = item.per_cu; - per_cu->queued = 0; - per_objfile->queue->pop_front (); + size_t nr_to_be_processed = per_objfile->queue->size (); + + std::vector results + = gdb::parallel_for_each (1, per_objfile->queue->begin (), + per_objfile->queue->end (), + [=] (iter_type iter, iter_type end) + { + for (; iter != end; ++iter) + { + dwarf2_queue_item &item = *iter; + process_queue_item (per_objfile, item); + } + + return result_type (1); + }); + + for (int i = 0; i < nr_to_be_processed; ++i) + { + dwarf2_queue_item &item = per_objfile->queue->front (); + dwarf2_per_cu_data *per_cu = item.per_cu; + per_cu->queued = 0; + per_objfile->queue->pop_front (); + } } dwarf_read_debug_printf ("Done expanding symtabs of %s.",