Index: include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp =================================================================== --- include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp +++ include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp @@ -14,8 +14,9 @@ #include "clang/Tooling/CommonOptionsParser.h" #include "clang/Tooling/Tooling.h" #include "llvm/Support/Path.h" - +#include "llvm/Support/ThreadPool.h" #include +#include #include #include @@ -74,23 +75,34 @@ }; bool Merge(llvm::StringRef MergeDir, llvm::StringRef OutputFile) { - std::error_code EC; std::set UniqueSymbols; + std::mutex SymbolMutex; + auto AddSymbols = [&](ArrayRef Symbols) { + // Synchronize set accesses. + std::unique_lock LockGuard(SymbolMutex); + for (const SymbolInfo &Symbol : Symbols) + UniqueSymbols.insert(Symbol); + }; + // Load all symbol files in MergeDir. + llvm::ThreadPool Pool; + std::error_code EC; for (llvm::sys::fs::directory_iterator Dir(MergeDir, EC), DirEnd; Dir != DirEnd && !EC; Dir.increment(EC)) { - int ReadFD = 0; - if (llvm::sys::fs::openFileForRead(Dir->path(), ReadFD)) { - llvm::errs() << "Cann't open " << Dir->path() << "\n"; - continue; - } - auto Buffer = llvm::MemoryBuffer::getOpenFile(ReadFD, Dir->path(), -1); - if (!Buffer) - continue; - std::vector Symbols = - ReadSymbolInfosFromYAML(Buffer.get()->getBuffer()); - for (const auto &Symbol : Symbols) - UniqueSymbols.insert(Symbol); + // Do the YAML file parsing in parallel. + Pool.async( + [&AddSymbols](std::string Path) { + auto Buffer = llvm::MemoryBuffer::getFile(Path); + if (!Buffer) { + llvm::errs() << "Cann't open " << Path << "\n"; + return; + } + std::vector Symbols = + ReadSymbolInfosFromYAML(Buffer.get()->getBuffer()); + // FIXME: Merge without creating such a heavy contention point. + AddSymbols(Symbols); + }, + Dir->path()); } llvm::raw_fd_ostream OS(OutputFile, EC, llvm::sys::fs::F_None);