Index: base/task_scheduler/scheduler_worker.cc |
diff --git a/base/task_scheduler/scheduler_worker.cc b/base/task_scheduler/scheduler_worker.cc |
index 4084c527a73c17e6ba4fa80398e792b1c268566b..409d5e15aee0ef77ecf95d07582ee0a392ff7486 100644 |
--- a/base/task_scheduler/scheduler_worker.cc |
+++ b/base/task_scheduler/scheduler_worker.cc |
@@ -201,25 +201,39 @@ void SchedulerWorker::Delegate::WaitForWork(WaitableEvent* wake_up_event) { |
wake_up_event->Reset(); |
} |
-scoped_refptr<SchedulerWorker> SchedulerWorker::Create( |
+SchedulerWorker::SchedulerWorker( |
ThreadPriority priority_hint, |
std::unique_ptr<Delegate> delegate, |
TaskTracker* task_tracker, |
- InitialState initial_state, |
- SchedulerBackwardCompatibility backward_compatibility) { |
- scoped_refptr<SchedulerWorker> worker( |
- new SchedulerWorker(priority_hint, std::move(delegate), task_tracker, |
- backward_compatibility)); |
- // Creation happens before any other thread can reference this one, so no |
- // synchronization is necessary. |
- if (initial_state == SchedulerWorker::InitialState::ALIVE) { |
- worker->CreateThread(); |
- if (!worker->thread_) { |
- return nullptr; |
- } |
+ SchedulerBackwardCompatibility backward_compatibility, |
+ InitialState initial_state) |
+ : priority_hint_(priority_hint), |
+ delegate_(std::move(delegate)), |
+ task_tracker_(task_tracker), |
+#if defined(OS_WIN) |
+ backward_compatibility_(backward_compatibility), |
+#endif |
+ initial_state_(initial_state) { |
+ DCHECK(delegate_); |
+ DCHECK(task_tracker_); |
+} |
+ |
+bool SchedulerWorker::Start() { |
+ AutoSchedulerLock auto_lock(thread_lock_); |
+ DCHECK(!started_); |
+ DCHECK(!thread_); |
+ |
+ if (should_exit_.IsSet()) |
+ return true; |
+ |
+ started_ = true; |
+ |
+ if (initial_state_ == InitialState::ALIVE) { |
+ CreateThread(); |
+ return !!thread_; |
} |
- return worker; |
+ return true; |
} |
void SchedulerWorker::WakeUp() { |
@@ -228,13 +242,14 @@ void SchedulerWorker::WakeUp() { |
DCHECK(!join_called_for_testing_.IsSet()); |
if (!thread_) |
- CreateThreadAssertSynchronized(); |
+ CreateThread(); |
if (thread_) |
thread_->WakeUp(); |
} |
void SchedulerWorker::JoinForTesting() { |
+ DCHECK(started_); |
DCHECK(!join_called_for_testing_.IsSet()); |
join_called_for_testing_.Set(); |
@@ -266,27 +281,9 @@ void SchedulerWorker::Cleanup() { |
// away |thread_| for destruction. |
AutoSchedulerLock auto_lock(thread_lock_); |
DCHECK(!should_exit_.IsSet()); |
- if (thread_) { |
- should_exit_.Set(); |
+ should_exit_.Set(); |
+ if (thread_) |
thread_->WakeUp(); |
- } |
-} |
- |
-SchedulerWorker::SchedulerWorker( |
- ThreadPriority priority_hint, |
- std::unique_ptr<Delegate> delegate, |
- TaskTracker* task_tracker, |
- SchedulerBackwardCompatibility backward_compatibility) |
- : priority_hint_(priority_hint), |
- delegate_(std::move(delegate)), |
- task_tracker_(task_tracker) |
-#if defined(OS_WIN) |
- , |
- backward_compatibility_(backward_compatibility) |
-#endif |
-{ |
- DCHECK(delegate_); |
- DCHECK(task_tracker_); |
} |
SchedulerWorker::~SchedulerWorker() { |
@@ -322,12 +319,9 @@ std::unique_ptr<SchedulerWorker::Thread> SchedulerWorker::DetachThreadObject( |
} |
void SchedulerWorker::CreateThread() { |
- thread_ = Thread::Create(make_scoped_refptr(this)); |
-} |
- |
-void SchedulerWorker::CreateThreadAssertSynchronized() { |
thread_lock_.AssertAcquired(); |
- CreateThread(); |
+ if (started_) |
+ thread_ = Thread::Create(make_scoped_refptr(this)); |
} |
bool SchedulerWorker::ShouldExit() { |