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,29 @@ 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+   // 
71+   //  This call can deadlock because we are sometimes holding the module lock so
72+   //  don't do it asynchronously.
73+   for  (size_t  i = 0 ; i < units_to_index.size (); ++i)
74+     extract_fn (i);
7275
7376  //  Now create a task runner that can index each DWARF unit in a
7477  //  separate thread so we can index quickly.
75- 
76-   TaskMapOverInt (0 , units_to_index.size (), parser_fn);
78+   for  (size_t  i = 0 ; i < units_to_index.size (); ++i)
79+     pool.async (parser_fn, i);
80+   pool.wait ();
7781
7882  auto  finalize_fn = [this , &sets](NameToDIE (IndexSet::*index)) {
7983    NameToDIE &result = m_set.*index;
@@ -82,14 +86,15 @@ void ManualDWARFIndex::Index() {
8286    result.Finalize ();
8387  };
8488
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); });
89+   pool.async (finalize_fn, &IndexSet::function_basenames);
90+   pool.async (finalize_fn, &IndexSet::function_fullnames);
91+   pool.async (finalize_fn, &IndexSet::function_methods);
92+   pool.async (finalize_fn, &IndexSet::function_selectors);
93+   pool.async (finalize_fn, &IndexSet::objc_class_selectors);
94+   pool.async (finalize_fn, &IndexSet::globals);
95+   pool.async (finalize_fn, &IndexSet::types);
96+   pool.async (finalize_fn, &IndexSet::namespaces);
97+   pool.wait ();
9398}
9499
95100void  ManualDWARFIndex::IndexUnit (DWARFUnit &unit, IndexSet &set) {
0 commit comments