Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/base/time_domain.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc b/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc |
| index 59e3e3476f776d525a833bef262c7a7a6f4d76a5..0c5004b5ef211dded951a0ebcc872ecd31ae5c02 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/base/time_domain.cc |
| @@ -27,7 +27,11 @@ void TimeDomain::RegisterQueue(internal::TaskQueueImpl* queue) { |
| void TimeDomain::UnregisterQueue(internal::TaskQueueImpl* queue) { |
| DCHECK(main_thread_checker_.CalledOnValidThread()); |
| DCHECK_EQ(queue->GetTimeDomain(), this); |
| - UnregisterAsUpdatableTaskQueue(queue); |
| + |
| + { |
| + base::AutoLock lock(has_incoming_immediate_work_lock_); |
| + has_incoming_immediate_work_.erase(queue); |
| + } |
| // If no wakeup has been requested then bail out. |
| if (!queue->heap_handle().IsValid()) |
| @@ -47,8 +51,12 @@ void TimeDomain::MigrateQueue(internal::TaskQueueImpl* queue, |
| // Make sure we remember to update |queue| if it's got incoming immediate |
| // work. |
| - if (UnregisterAsUpdatableTaskQueue(queue)) |
| - destination_time_domain->updatable_queue_set_.insert(queue); |
| + { |
| + base::AutoLock lock(has_incoming_immediate_work_lock_); |
| + if (has_incoming_immediate_work_.erase(queue)) { |
| + destination_time_domain->has_incoming_immediate_work_.insert(queue); |
|
Sami
2017/01/18 17:57:04
Looks like we need to grab the destination lock he
alex clarke (OOO till 29th)
2017/01/19 08:50:52
I'd like has_incoming_immediate_work_ to end up on
Sami
2017/01/19 11:57:38
That sounds fine, but for the time being don't we
alex clarke (OOO till 29th)
2017/01/19 12:34:31
Done.
|
| + } |
| + } |
| // If no wakeup has been requested then bail out. |
| if (!queue->heap_handle().IsValid()) |
| @@ -94,64 +102,32 @@ void TimeDomain::ScheduleDelayedWork(internal::TaskQueueImpl* queue, |
| observer_->OnTimeDomainHasDelayedWork(queue); |
| } |
| -void TimeDomain::RegisterAsUpdatableTaskQueue(internal::TaskQueueImpl* queue) { |
| +void TimeDomain::OnQueueHasIncomingImmediateWork( |
| + internal::TaskQueueImpl* queue) { |
| { |
| - base::AutoLock lock(newly_updatable_lock_); |
| - newly_updatable_.push_back(queue); |
| + base::AutoLock lock(has_incoming_immediate_work_lock_); |
| + has_incoming_immediate_work_.insert(queue); |
| } |
| + |
| if (observer_) |
| observer_->OnTimeDomainHasImmediateWork(queue); |
| } |
| -bool TimeDomain::UnregisterAsUpdatableTaskQueue( |
| - internal::TaskQueueImpl* queue) { |
| - DCHECK(main_thread_checker_.CalledOnValidThread()); |
| - |
| - bool was_updatable = updatable_queue_set_.erase(queue) != 0; |
| - |
| - base::AutoLock lock(newly_updatable_lock_); |
| - // Remove all copies of |queue| from |newly_updatable_|. |
| - for (size_t i = 0; i < newly_updatable_.size();) { |
| - if (newly_updatable_[i] == queue) { |
| - // Move last element into slot #i and then compact. |
| - newly_updatable_[i] = newly_updatable_.back(); |
| - newly_updatable_.pop_back(); |
| - was_updatable = true; |
| - } else { |
| - i++; |
| - } |
| - } |
| - return was_updatable; |
| -} |
| - |
| void TimeDomain::UpdateWorkQueues(LazyNow lazy_now) { |
| DCHECK(main_thread_checker_.CalledOnValidThread()); |
| // Move any ready delayed tasks into the Incoming queues. |
| WakeupReadyDelayedQueues(&lazy_now); |
| - MoveNewlyUpdatableQueuesIntoUpdatableQueueSet(); |
| - |
| - std::set<internal::TaskQueueImpl*>::iterator iter = |
| - updatable_queue_set_.begin(); |
| - while (iter != updatable_queue_set_.end()) { |
| - std::set<internal::TaskQueueImpl*>::iterator queue_it = iter++; |
| - internal::TaskQueueImpl* queue = *queue_it; |
| + std::set<internal::TaskQueueImpl*> queues_to_reload_if_empty; |
| - // Update the queue and remove from the set if subsequent updates are not |
| - // required. |
| - if (!queue->MaybeUpdateImmediateWorkQueues()) |
| - updatable_queue_set_.erase(queue_it); |
| + { |
| + base::AutoLock lock(has_incoming_immediate_work_lock_); |
| + std::swap(queues_to_reload_if_empty, has_incoming_immediate_work_); |
| } |
| -} |
| -void TimeDomain::MoveNewlyUpdatableQueuesIntoUpdatableQueueSet() { |
| - DCHECK(main_thread_checker_.CalledOnValidThread()); |
| - base::AutoLock lock(newly_updatable_lock_); |
| - while (!newly_updatable_.empty()) { |
| - updatable_queue_set_.insert(newly_updatable_.back()); |
| - newly_updatable_.pop_back(); |
| - } |
| + for (internal::TaskQueueImpl* queue : queues_to_reload_if_empty) |
| + queue->ReloadImmediateWorkQueueIfEmpty(); |
| } |
| void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) { |
| @@ -190,10 +166,13 @@ bool TimeDomain::NextScheduledTaskQueue(TaskQueue** out_task_queue) const { |
| void TimeDomain::AsValueInto(base::trace_event::TracedValue* state) const { |
| state->BeginDictionary(); |
| state->SetString("name", GetName()); |
| - state->BeginArray("updatable_queue_set"); |
| - for (auto* queue : updatable_queue_set_) |
| - state->AppendString(queue->GetName()); |
| - state->EndArray(); |
| + { |
| + base::AutoLock lock(has_incoming_immediate_work_lock_); |
| + state->BeginArray("has_incoming_immediate_work"); |
| + for (internal::TaskQueueImpl* queue : has_incoming_immediate_work_) |
| + state->AppendString(queue->GetName()); |
| + state->EndArray(); |
| + } |
| state->SetInteger("registered_delay_count", delayed_wakeup_queue_.size()); |
| if (!delayed_wakeup_queue_.empty()) { |
| base::TimeDelta delay = delayed_wakeup_queue_.min().time - Now(); |