| Index: base/task_scheduler/scheduler_worker_thread.cc
|
| diff --git a/base/task_scheduler/scheduler_worker_thread.cc b/base/task_scheduler/scheduler_worker_thread.cc
|
| index e03726a0c09b886167d863057cb56a25def51d63..3ae95bf065deb25856eb946808bb30e6624a5d8e 100644
|
| --- a/base/task_scheduler/scheduler_worker_thread.cc
|
| +++ b/base/task_scheduler/scheduler_worker_thread.cc
|
| @@ -9,6 +9,7 @@
|
| #include <utility>
|
|
|
| #include "base/logging.h"
|
| +#include "base/task_scheduler/scheduler_worker_thread_delegate.h"
|
| #include "base/task_scheduler/task_tracker.h"
|
|
|
| namespace base {
|
| @@ -17,14 +18,10 @@ namespace internal {
|
| std::unique_ptr<SchedulerWorkerThread>
|
| SchedulerWorkerThread::CreateSchedulerWorkerThread(
|
| ThreadPriority thread_priority,
|
| - const Closure& main_entry_callback,
|
| - const GetWorkCallback& get_work_callback,
|
| - const RanTaskFromSequenceCallback& ran_task_from_sequence_callback,
|
| + SchedulerWorkerThreadDelegate* delegate,
|
| TaskTracker* task_tracker) {
|
| std::unique_ptr<SchedulerWorkerThread> worker_thread(
|
| - new SchedulerWorkerThread(thread_priority, main_entry_callback,
|
| - get_work_callback,
|
| - ran_task_from_sequence_callback, task_tracker));
|
| + new SchedulerWorkerThread(thread_priority, delegate, task_tracker));
|
|
|
| if (worker_thread->thread_handle_.is_null())
|
| return nullptr;
|
| @@ -50,18 +47,12 @@ void SchedulerWorkerThread::JoinForTesting() {
|
|
|
| SchedulerWorkerThread::SchedulerWorkerThread(
|
| ThreadPriority thread_priority,
|
| - const Closure& main_entry_callback,
|
| - const GetWorkCallback& get_work_callback,
|
| - const RanTaskFromSequenceCallback& ran_task_from_sequence_callback,
|
| + SchedulerWorkerThreadDelegate* delegate,
|
| TaskTracker* task_tracker)
|
| : wake_up_event_(false, false),
|
| - main_entry_callback_(main_entry_callback),
|
| - get_work_callback_(get_work_callback),
|
| - ran_task_from_sequence_callback_(ran_task_from_sequence_callback),
|
| + delegate_(delegate),
|
| task_tracker_(task_tracker) {
|
| - DCHECK(!main_entry_callback_.is_null());
|
| - DCHECK(!get_work_callback_.is_null());
|
| - DCHECK(!ran_task_from_sequence_callback_.is_null());
|
| + DCHECK(delegate_);
|
| DCHECK(task_tracker_);
|
|
|
| static const size_t kDefaultStackSize = 0;
|
| @@ -70,14 +61,14 @@ SchedulerWorkerThread::SchedulerWorkerThread(
|
| }
|
|
|
| void SchedulerWorkerThread::ThreadMain() {
|
| - main_entry_callback_.Run();
|
| + delegate_->OnMainEntry();
|
|
|
| // A SchedulerWorkerThread starts out sleeping.
|
| wake_up_event_.Wait();
|
|
|
| while (!task_tracker_->shutdown_completed() && !ShouldExitForTesting()) {
|
| // Get the sequence containing the next task to execute.
|
| - scoped_refptr<Sequence> sequence = get_work_callback_.Run(this);
|
| + scoped_refptr<Sequence> sequence = delegate_->GetWork();
|
|
|
| if (!sequence) {
|
| wake_up_event_.Wait();
|
| @@ -85,15 +76,17 @@ void SchedulerWorkerThread::ThreadMain() {
|
| }
|
|
|
| task_tracker_->RunTask(sequence->PeekTask());
|
| - ran_task_from_sequence_callback_.Run(this, std::move(sequence));
|
| + delegate_->RanTaskFromSequence(std::move(sequence));
|
|
|
| // Calling WakeUp() guarantees that this SchedulerWorkerThread will run
|
| - // Tasks from Sequences returned by |get_work_callback_| until the callback
|
| - // returns nullptr. Resetting |wake_up_event_| here doesn't break this
|
| - // invariant and avoids a useless loop iteration before going to sleep if
|
| - // WakeUp() is called while this SchedulerWorkerThread is awake.
|
| + // Tasks from Sequences returned by the GetWork() method of |delegate_|
|
| + // until it returns nullptr. Resetting |wake_up_event_| here doesn't break
|
| + // this invariant and avoids a useless loop iteration before going to sleep
|
| + // if WakeUp() is called while this SchedulerWorkerThread is awake.
|
| wake_up_event_.Reset();
|
| }
|
| +
|
| + delegate_->OnMainExit();
|
| }
|
|
|
| bool SchedulerWorkerThread::ShouldExitForTesting() const {
|
|
|