Author: kadircet Date: Tue Oct 30 05:13:27 2018 New Revision: 345590 URL: http://llvm.org/viewvc/llvm-project?rev=345590&view=rev Log: [clangd] Use thread pool for background indexing.
Reviewers: sammccall, ioeric Reviewed By: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, jfb, cfe-commits Differential Revision: https://reviews.llvm.org/D53651 Modified: clang-tools-extra/trunk/clangd/Threading.cpp clang-tools-extra/trunk/clangd/Threading.h clang-tools-extra/trunk/clangd/index/Background.cpp clang-tools-extra/trunk/clangd/index/Background.h Modified: clang-tools-extra/trunk/clangd/Threading.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Threading.cpp?rev=345590&r1=345589&r2=345590&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Threading.cpp (original) +++ clang-tools-extra/trunk/clangd/Threading.cpp Tue Oct 30 05:13:27 2018 @@ -1,9 +1,13 @@ #include "Threading.h" #include "Trace.h" #include "llvm/ADT/ScopeExit.h" +#include "llvm/Config/config.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Threading.h" #include <thread> +#ifdef HAVE_PTHREAD_H +#include <pthread.h> +#endif using namespace llvm; namespace clang { @@ -97,5 +101,15 @@ void wait(std::unique_lock<std::mutex> & CV.wait_until(Lock, D.time()); } +void setThreadPriority(std::thread &T, ThreadPriority Priority) { +#ifdef HAVE_PTHREAD_H + sched_param priority; + priority.sched_priority = 0; + pthread_setschedparam( + T.native_handle(), + Priority == ThreadPriority::Low ? SCHED_IDLE : SCHED_OTHER, &priority); +#endif +} + } // namespace clangd } // namespace clang Modified: clang-tools-extra/trunk/clangd/Threading.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Threading.h?rev=345590&r1=345589&r2=345590&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Threading.h (original) +++ clang-tools-extra/trunk/clangd/Threading.h Tue Oct 30 05:13:27 2018 @@ -17,6 +17,7 @@ #include <condition_variable> #include <memory> #include <mutex> +#include <thread> #include <vector> namespace clang { @@ -115,6 +116,13 @@ private: mutable std::condition_variable TasksReachedZero; std::size_t InFlightTasks = 0; }; + +enum class ThreadPriority { + Low = 0, + Normal = 1, +}; +void setThreadPriority(std::thread &T, ThreadPriority Priority); + } // namespace clangd } // namespace clang #endif Modified: clang-tools-extra/trunk/clangd/index/Background.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/Background.cpp?rev=345590&r1=345589&r2=345590&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/Background.cpp (original) +++ clang-tools-extra/trunk/clangd/index/Background.cpp Tue Oct 30 05:13:27 2018 @@ -11,6 +11,7 @@ #include "ClangdUnit.h" #include "Compiler.h" #include "Logger.h" +#include "Threading.h" #include "Trace.h" #include "index/IndexAction.h" #include "index/MemIndex.h" @@ -25,14 +26,26 @@ namespace clangd { BackgroundIndex::BackgroundIndex(Context BackgroundContext, StringRef ResourceDir, const FileSystemProvider &FSProvider, - ArrayRef<std::string> URISchemes) + ArrayRef<std::string> URISchemes, + size_t ThreadPoolSize) : SwapIndex(make_unique<MemIndex>()), ResourceDir(ResourceDir), FSProvider(FSProvider), BackgroundContext(std::move(BackgroundContext)), - URISchemes(URISchemes), Thread([this] { run(); }) {} + URISchemes(URISchemes) { + assert(ThreadPoolSize > 0 && "Thread pool size can't be zero."); + while (ThreadPoolSize--) { + ThreadPool.emplace_back([this] { run(); }); + // Set priority to low, since background indexing is a long running task we + // do not want to eat up cpu when there are any other high priority threads. + // FIXME: In the future we might want a more general way of handling this to + // support a tasks with various priorities. + setThreadPriority(ThreadPool.back(), ThreadPriority::Low); + } +} BackgroundIndex::~BackgroundIndex() { stop(); - Thread.join(); + for (auto &Thread : ThreadPool) + Thread.join(); } void BackgroundIndex::stop() { @@ -44,7 +57,7 @@ void BackgroundIndex::stop() { } void BackgroundIndex::run() { - WithContext Background(std::move(BackgroundContext)); + WithContext Background(BackgroundContext.clone()); while (true) { Optional<Task> Task; { Modified: clang-tools-extra/trunk/clangd/index/Background.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/Background.h?rev=345590&r1=345589&r2=345590&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/Background.h (original) +++ clang-tools-extra/trunk/clangd/index/Background.h Tue Oct 30 05:13:27 2018 @@ -16,6 +16,7 @@ #include "index/Index.h" #include "clang/Tooling/CompilationDatabase.h" #include "llvm/Support/SHA1.h" +#include "llvm/Support/Threading.h" #include <condition_variable> #include <deque> #include <string> @@ -34,7 +35,8 @@ public: // FIXME: resource-dir injection should be hoisted somewhere common. BackgroundIndex(Context BackgroundContext, StringRef ResourceDir, const FileSystemProvider &, - ArrayRef<std::string> URISchemes = {}); + ArrayRef<std::string> URISchemes = {}, + size_t ThreadPoolSize = llvm::hardware_concurrency()); ~BackgroundIndex(); // Blocks while the current task finishes. // Enqueue a translation unit for indexing. @@ -66,7 +68,7 @@ private: llvm::StringMap<Hash> FileHash; // Digest of indexed file. // queue management - using Task = std::function<void()>; // FIXME: use multiple worker threads. + using Task = std::function<void()>; void run(); // Main loop executed by Thread. Runs tasks from Queue. void enqueueLocked(tooling::CompileCommand Cmd); std::mutex QueueMu; @@ -74,7 +76,7 @@ private: std::condition_variable QueueCV; bool ShouldStop = false; std::deque<Task> Queue; - std::thread Thread; // Must be last, spawned thread reads instance vars. + std::vector<std::thread> ThreadPool; // FIXME: Abstract this away. }; } // namespace clangd _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits