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..85ba7a3579c5acdd91cb8056c56792d1862a1181 100644 |
--- a/base/task_scheduler/scheduler_worker.cc |
+++ b/base/task_scheduler/scheduler_worker.cc |
@@ -39,6 +39,9 @@ class SchedulerWorker::Thread : public PlatformThread::Delegate { |
while (!outer_->task_tracker_->IsShutdownComplete() && |
!outer_->ShouldExitForTesting()) { |
DCHECK(outer_); |
+ |
+ UpdateThreadPriority(GetDesiredThreadPriority()); |
+ |
// Get the sequence containing the next task to execute. |
scoped_refptr<Sequence> sequence = outer_->delegate_->GetWork(outer_); |
if (!sequence) { |
@@ -91,17 +94,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 +120,26 @@ 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 UpdateThreadPriority(ThreadPriority desired_thread_priority) { |
robliao
2016/07/21 17:05:51
Nit: Use SetThreadPriority.
fdoray
2016/07/21 17:54:53
Done.
gab
2016/07/21 21:29:51
I prefered Update* as it didn't clash with underly
fdoray
2016/07/22 12:56:32
Done. I prefer Update* too.
|
+ if (desired_thread_priority != current_thread_priority_) { |
+ PlatformThread::SetCurrentThreadPriority(desired_thread_priority); |
+ current_thread_priority_ = desired_thread_priority; |
+ } |
+ } |
+ |
PlatformThreadHandle thread_handle_; |
SchedulerWorker* outer_; |
@@ -124,6 +147,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); |
}; |