summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/Unix/Threading.inc
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Support/Unix/Threading.inc')
-rw-r--r--llvm/lib/Support/Unix/Threading.inc52
1 files changed, 24 insertions, 28 deletions
diff --git a/llvm/lib/Support/Unix/Threading.inc b/llvm/lib/Support/Unix/Threading.inc
index 5de1cf071ba9..c1c266c0ab4f 100644
--- a/llvm/lib/Support/Unix/Threading.inc
+++ b/llvm/lib/Support/Unix/Threading.inc
@@ -247,38 +247,34 @@ void llvm::get_thread_name(SmallVectorImpl<char> &Name) {
}
SetThreadPriorityResult llvm::set_thread_priority(ThreadPriority Priority) {
-#if defined(__linux__) && defined(SCHED_IDLE)
- // Some *really* old glibcs are missing SCHED_IDLE.
+#if defined(__linux__) || defined(__APPLE__)
+ int policy;
+ sched_param priority;
+#if defined(SCHED_IDLE)
// http://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html
// http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html
- sched_param priority;
- // For each of the above policies, param->sched_priority must be 0.
- priority.sched_priority = 0;
// SCHED_IDLE for running very low priority background jobs.
// SCHED_OTHER the standard round-robin time-sharing policy;
- return !pthread_setschedparam(
- pthread_self(),
- Priority == ThreadPriority::Background ? SCHED_IDLE : SCHED_OTHER,
- &priority)
- ? SetThreadPriorityResult::SUCCESS
- : SetThreadPriorityResult::FAILURE;
-#elif defined(__APPLE__)
- // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getpriority.2.html
- // When setting a thread into background state the scheduling priority is set
- // to lowest value, disk and network IO are throttled. Network IO will be
- // throttled for any sockets the thread opens after going into background
- // state. Any previously opened sockets are not affected.
-
- // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/getiopolicy_np.3.html
- // I/Os with THROTTLE policy are called THROTTLE I/Os. If a THROTTLE I/O
- // request occurs within a small time window (usually a fraction of a second)
- // of another NORMAL I/O request, the thread that issues the THROTTLE I/O is
- // forced to sleep for a certain interval. This slows down the thread that
- // issues the THROTTLE I/O so that NORMAL I/Os can utilize most of the disk
- // I/O bandwidth.
- return !setpriority(PRIO_DARWIN_THREAD, 0,
- Priority == ThreadPriority::Background ? PRIO_DARWIN_BG
- : 0)
+ policy = Priority == ThreadPriority::Background ? SCHED_IDLE : SCHED_OTHER;
+ // For each of the above policies, param->sched_priority must be 0.
+ priority.sched_priority = 0;
+#else
+ // Apple, and some *really* old glibcs are missing SCHED_IDLE.
+ if (pthread_getschedparam(pthread_self(), &policy, &priority) != 0) {
+ return SetThreadPriorityResult::FAILURE;
+ }
+ // Keep the policy. Set priority depending on ThreadPriority
+ if (Priority == ThreadPriority::Background) {
+ // low priority
+ priority.sched_priority = sched_get_priority_min(policy);
+ } else {
+ // middle priority
+ const int minPrio = sched_get_priority_min(policy);
+ const int maxPrio = sched_get_priority_max(policy);
+ priority.sched_priority = std::max(0, maxPrio - minPrio) / 2 + minPrio;
+ }
+#endif
+ return !pthread_setschedparam(pthread_self(), policy, &priority)
? SetThreadPriorityResult::SUCCESS
: SetThreadPriorityResult::FAILURE;
#endif