Index: base/task_scheduler/scheduler_worker.cc |
diff --git a/base/task_scheduler/scheduler_worker.cc b/base/task_scheduler/scheduler_worker.cc |
index 5a2a7d6a92b96272e1d148edeaec2c4a1782b672..5fb65c05d0162c9c96fa3389b9a72453e93aabab 100644 |
--- a/base/task_scheduler/scheduler_worker.cc |
+++ b/base/task_scheduler/scheduler_worker.cc |
@@ -10,6 +10,7 @@ |
#include "base/logging.h" |
#include "base/task_scheduler/task_tracker.h" |
+#include "build/build_config.h" |
namespace base { |
namespace internal { |
@@ -39,6 +40,9 @@ class SchedulerWorker::Thread : public PlatformThread::Delegate { |
while (!outer_->task_tracker_->IsShutdownComplete() && |
!outer_->ShouldExitForTesting()) { |
DCHECK(outer_); |
+ |
+ SetThreadPriority(GetDesiredThreadPriority()); |
+ |
// Get the sequence containing the next task to execute. |
scoped_refptr<Sequence> sequence = outer_->delegate_->GetWork(outer_); |
if (!sequence) { |
@@ -91,17 +95,17 @@ class SchedulerWorker::Thread : public PlatformThread::Delegate { |
private: |
Thread(SchedulerWorker* outer) |
- : outer_(outer), |
- wake_up_event_(WaitableEvent::ResetPolicy::MANUAL, |
- WaitableEvent::InitialState::NOT_SIGNALED) { |
+ : outer_(outer), |
+ wake_up_event_(WaitableEvent::ResetPolicy::MANUAL, |
+ WaitableEvent::InitialState::NOT_SIGNALED), |
+ current_thread_priority_(GetDesiredThreadPriority()) { |
DCHECK(outer_); |
} |
void Initialize() { |
constexpr size_t kDefaultStackSize = 0; |
- PlatformThread::CreateWithPriority(kDefaultStackSize, this, |
- &thread_handle_, |
- outer_->thread_priority_); |
+ PlatformThread::CreateWithPriority(kDefaultStackSize, this, &thread_handle_, |
+ current_thread_priority_); |
} |
void WaitForWork() { |
@@ -117,6 +121,36 @@ class SchedulerWorker::Thread : public PlatformThread::Delegate { |
wake_up_event_.Reset(); |
} |
+ // Returns the desired thread priority based on the worker priority and the |
+ // current shutdown state. |
+ ThreadPriority GetDesiredThreadPriority() { |
+ DCHECK(outer_); |
+ |
+ if (outer_->task_tracker_->HasShutdownStarted() && |
+ static_cast<int>(outer_->thread_priority_) < |
+ static_cast<int>(ThreadPriority::NORMAL)) { |
+ return ThreadPriority::NORMAL; |
+ } |
+ return outer_->thread_priority_; |
+ } |
+ |
+ void SetThreadPriority(ThreadPriority desired_thread_priority) { |
+ if (desired_thread_priority == current_thread_priority_) |
+ return; |
+ |
+#if defined(OS_LINUX) |
+ if (static_cast<int>(desired_thread_priority) > |
+ static_cast<int>(current_thread_priority_)) { |
gab
2016/07/21 21:29:51
If we can't bring it up, we shouldn't bring it dow
fdoray
2016/07/22 12:56:32
Done. I disabled this method completely on Linux.
gab
2016/07/22 13:33:26
An alternate option is to detach the BACKGROUND th
|
+ // Increasing the thread priority requires the CAP_SYS_NICE capability on |
+ // Linux. |
+ return; |
+ } |
+#endif // defined(OS_LINUX) |
+ |
+ PlatformThread::SetCurrentThreadPriority(desired_thread_priority); |
+ current_thread_priority_ = desired_thread_priority; |
+ } |
+ |
PlatformThreadHandle thread_handle_; |
SchedulerWorker* outer_; |
@@ -124,6 +158,10 @@ class SchedulerWorker::Thread : public PlatformThread::Delegate { |
// Event signaled to wake up this thread. |
WaitableEvent wake_up_event_; |
+ // Current priority of this thread. May be different from |
+ // |outer_->thread_priority_| during shutdown. |
+ ThreadPriority current_thread_priority_; |
+ |
DISALLOW_COPY_AND_ASSIGN(Thread); |
}; |