diff options
Diffstat (limited to 'clang-tools-extra/clangd')
-rw-r--r-- | clang-tools-extra/clangd/Threading.cpp | 9 | ||||
-rw-r--r-- | clang-tools-extra/clangd/Threading.h | 4 | ||||
-rw-r--r-- | clang-tools-extra/clangd/tool/ClangdMain.cpp | 1 |
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( |