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(); |
robliao
2016/04/06 20:50:18
What's the plan for getting work from the single t
fdoray
2016/04/06 21:11:38
3 possible solutions:
1) Single-threaded PQ is own
robliao
2016/04/06 21:28:20
Sounds good. Just wanted to me sure this wasn't om
|
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 { |