summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd')
-rw-r--r--clang-tools-extra/clangd/Threading.cpp9
-rw-r--r--clang-tools-extra/clangd/Threading.h4
-rw-r--r--clang-tools-extra/clangd/tool/ClangdMain.cpp1
3 files changed, 13 insertions, 1 deletions
diff --git a/clang-tools-extra/clangd/Threading.cpp b/clang-tools-extra/clangd/Threading.cpp
index e0c90f3a1d8..b427ce37ca2 100644
--- a/clang-tools-extra/clangd/Threading.cpp
+++ b/clang-tools-extra/clangd/Threading.cpp
@@ -3,6 +3,7 @@
#include "llvm/ADT/ScopeExit.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/Threading.h"
+#include <atomic>
#include <thread>
#ifdef __USE_POSIX
#include <pthread.h>
@@ -100,6 +101,8 @@ void wait(std::unique_lock<std::mutex> &Lock, std::condition_variable &CV,
CV.wait_until(Lock, D.time());
}
+static std::atomic<bool> AvoidThreadStarvation = {false};
+
void setThreadPriority(std::thread &T, ThreadPriority Priority) {
// Some *really* old glibcs are missing SCHED_IDLE.
#if defined(__linux__) && defined(SCHED_IDLE)
@@ -107,9 +110,13 @@ void setThreadPriority(std::thread &T, ThreadPriority Priority) {
priority.sched_priority = 0;
pthread_setschedparam(
T.native_handle(),
- Priority == ThreadPriority::Low ? SCHED_IDLE : SCHED_OTHER, &priority);
+ Priority == ThreadPriority::Low && !AvoidThreadStarvation ? SCHED_IDLE
+ : SCHED_OTHER,
+ &priority);
#endif
}
+void preventThreadStarvationInTests() { AvoidThreadStarvation = true; }
+
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/clangd/Threading.h b/clang-tools-extra/clangd/Threading.h
index 71becf68976..1b34831a15c 100644
--- a/clang-tools-extra/clangd/Threading.h
+++ b/clang-tools-extra/clangd/Threading.h
@@ -122,6 +122,10 @@ enum class ThreadPriority {
Normal = 1,
};
void setThreadPriority(std::thread &T, ThreadPriority Priority);
+// Avoid the use of scheduler policies that may starve low-priority threads.
+// This prevents tests from timing out on loaded systems.
+// Affects subsequent setThreadPriority() calls.
+void preventThreadStarvationInTests();
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp
index e349ee02751..ea542c1086b 100644
--- a/clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -254,6 +254,7 @@ int main(int argc, char *argv[]) {
RunSynchronously = true;
InputStyle = JSONStreamStyle::Delimited;
PrettyPrint = true;
+ preventThreadStarvationInTests(); // Ensure background index makes progress.
}
if (Test || EnableTestScheme) {
static URISchemeRegistry::Add<TestScheme> X(
OpenPOWER on IntegriCloud