[clang-tools-extra] r345590 - [clangd] Use thread pool for background indexing.
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 30 05:13:27 PDT 2018
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
More information about the cfe-commits
mailing list