1313#include " Plugins/SymbolFile/DWARF/LogChannelDWARF.h"
1414#include " Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h"
1515#include " lldb/Core/Module.h"
16- #include " lldb/Host/TaskPool.h"
1716#include " lldb/Symbol/ObjectFile.h"
1817#include " lldb/Utility/Stream.h"
1918#include " lldb/Utility/Timer.h"
19+ #include " llvm/Support/ThreadPool.h"
2020
2121using namespace lldb_private ;
2222using namespace lldb ;
@@ -55,25 +55,27 @@ void ManualDWARFIndex::Index() {
5555 clear_cu_dies[cu_idx] = units_to_index[cu_idx]->ExtractDIEsScoped ();
5656 };
5757
58+ // Share one thread pool across operations to avoid the overhead of
59+ // recreating the threads.
60+ llvm::ThreadPool pool;
61+
5862 // Create a task runner that extracts dies for each DWARF unit in a
59- // separate thread
63+ // separate thread.
6064 // First figure out which units didn't have their DIEs already
6165 // parsed and remember this. If no DIEs were parsed prior to this index
6266 // function call, we are going to want to clear the CU dies after we are
6367 // done indexing to make sure we don't pull in all DWARF dies, but we need
64- // to wait until all compile units have been indexed in case a DIE in one
65- // compile unit refers to another and the indexes accesses those DIEs.
66- // ----------------------------------------------------------------------
67- for (int i=0 ; i<units_to_index.size (); ++i) {
68- extract_fn (i);
69- }
70- // This call can deadlock because we are sometimes holding the module lock.
71- // TaskMapOverInt(0, units_to_index.size(), extract_fn);
68+ // to wait until all units have been indexed in case a DIE in one
69+ // unit refers to another and the indexes accesses those DIEs.
70+ for (size_t i = 0 ; i < units_to_index.size (); ++i)
71+ pool.async (extract_fn, i);
72+ pool.wait ();
7273
7374 // Now create a task runner that can index each DWARF unit in a
7475 // separate thread so we can index quickly.
75-
76- TaskMapOverInt (0 , units_to_index.size (), parser_fn);
76+ for (size_t i = 0 ; i < units_to_index.size (); ++i)
77+ pool.async (parser_fn, i);
78+ pool.wait ();
7779
7880 auto finalize_fn = [this , &sets](NameToDIE (IndexSet::*index)) {
7981 NameToDIE &result = m_set.*index;
@@ -82,14 +84,15 @@ void ManualDWARFIndex::Index() {
8284 result.Finalize ();
8385 };
8486
85- TaskPool::RunTasks ([&]() { finalize_fn (&IndexSet::function_basenames); },
86- [&]() { finalize_fn (&IndexSet::function_fullnames); },
87- [&]() { finalize_fn (&IndexSet::function_methods); },
88- [&]() { finalize_fn (&IndexSet::function_selectors); },
89- [&]() { finalize_fn (&IndexSet::objc_class_selectors); },
90- [&]() { finalize_fn (&IndexSet::globals); },
91- [&]() { finalize_fn (&IndexSet::types); },
92- [&]() { finalize_fn (&IndexSet::namespaces); });
87+ pool.async (finalize_fn, &IndexSet::function_basenames);
88+ pool.async (finalize_fn, &IndexSet::function_fullnames);
89+ pool.async (finalize_fn, &IndexSet::function_methods);
90+ pool.async (finalize_fn, &IndexSet::function_selectors);
91+ pool.async (finalize_fn, &IndexSet::objc_class_selectors);
92+ pool.async (finalize_fn, &IndexSet::globals);
93+ pool.async (finalize_fn, &IndexSet::types);
94+ pool.async (finalize_fn, &IndexSet::namespaces);
95+ pool.wait ();
9396}
9497
9598void ManualDWARFIndex::IndexUnit (DWARFUnit &unit, IndexSet &set) {
0 commit comments