Index: base/task_scheduler/scheduler_worker.cc |
diff --git a/base/task_scheduler/scheduler_worker.cc b/base/task_scheduler/scheduler_worker.cc |
index e64ca61de00600db5cc08b2d7b7937f742db860f..054227193bbad5a82c3bbe6830736b80d9919dbb 100644 |
--- a/base/task_scheduler/scheduler_worker.cc |
+++ b/base/task_scheduler/scheduler_worker.cc |
@@ -36,10 +36,7 @@ class SchedulerWorker::Thread : public PlatformThread::Delegate { |
// Set if this thread was detached. |
std::unique_ptr<Thread> detached_thread; |
- outer_->delegate_->OnMainEntry( |
- outer_, outer_->last_detach_time_.is_null() |
- ? TimeDelta::Max() |
- : TimeTicks::Now() - outer_->last_detach_time_); |
+ outer_->delegate_->OnMainEntry(outer_); |
// A SchedulerWorker starts out waiting for work. |
WaitForWork(); |
@@ -60,9 +57,9 @@ class SchedulerWorker::Thread : public PlatformThread::Delegate { |
if (outer_->delegate_->CanDetach(outer_)) { |
detached_thread = outer_->Detach(); |
if (detached_thread) { |
+ outer_ = nullptr; |
DCHECK_EQ(detached_thread.get(), this); |
PlatformThread::Detach(thread_handle_); |
- outer_ = nullptr; |
break; |
} |
} |
@@ -256,7 +253,11 @@ std::unique_ptr<SchedulerWorker::Thread> SchedulerWorker::Detach() { |
// guarantee that we call GetWork() after a successful wakeup. |
if (thread_->IsWakeUpPending()) |
return nullptr; |
- last_detach_time_ = TimeTicks::Now(); |
+ |
+ // Call OnDetach() within the scope of |thread_lock_| to prevent the delegate |
+ // from being used concurrently from an old and a new thread. |
+ delegate_->OnDetach(); |
+ |
return std::move(thread_); |
} |