Index: third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
index 8ad3792e25302071d35e9993538318000014bf8b..16a7ec8d1675e1acee1e2f124425344c020eda90 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
@@ -154,8 +154,11 @@ TaskQueueImpl::MainThreadOnly::MainThreadOnly( |
TimeDomain* time_domain) |
: task_queue_manager(task_queue_manager), |
time_domain(time_domain), |
- delayed_work_queue(new WorkQueue(task_queue, "delayed")), |
- immediate_work_queue(new WorkQueue(task_queue, "immediate")), |
+ delayed_work_queue( |
+ new WorkQueue(task_queue, "delayed", WorkQueue::QueueType::DELAYED)), |
+ immediate_work_queue(new WorkQueue(task_queue, |
+ "immediate", |
+ WorkQueue::QueueType::IMMEDIATE)), |
set_index(0), |
is_enabled_refcount(0), |
voter_refcount(0), |
@@ -183,7 +186,6 @@ void TaskQueueImpl::UnregisterTaskQueue() { |
} |
bool TaskQueueImpl::RunsTasksOnCurrentThread() const { |
- base::AutoLock lock(any_thread_lock_); |
return base::PlatformThread::CurrentId() == thread_id_; |
} |
@@ -325,26 +327,46 @@ void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked( |
base::TimeTicks desired_run_time, |
EnqueueOrder sequence_number, |
bool nestable) { |
- if (any_thread().immediate_incoming_queue.empty()) |
- any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); |
// If the |immediate_incoming_queue| is empty we need a DoWork posted to make |
// it run. |
if (any_thread().immediate_incoming_queue.empty()) { |
- // There's no point posting a DoWork for a disabled queue, however we can |
- // only tell if it's disabled from the main thread. |
- if (base::PlatformThread::CurrentId() == thread_id_) { |
- if (IsQueueEnabled() && !BlockedByFenceLocked()) |
- any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); |
- } else { |
- any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); |
- } |
+ any_thread().task_queue_manager->OnQueueHasImmediateWork(this); |
+ any_thread().time_domain->OnQueueHasImmediateWork(this); |
} |
+ |
any_thread().immediate_incoming_queue.emplace( |
- posted_from, task, desired_run_time, sequence_number, nestable, sequence_number); |
- any_thread().task_queue_manager->DidQueueTask( any_thread().immediate_incoming_queue.back()); |
+ posted_from, task, desired_run_time, sequence_number, nestable, |
+ sequence_number); |
+ any_thread().task_queue_manager->DidQueueTask( |
+ any_thread().immediate_incoming_queue.back()); |
TraceQueueSize(true); |
} |
+void TaskQueueImpl::OnIncomingImmediateTaskAvailable() { |
Sami
2016/12/05 17:52:54
I think having this method makes sense but the nam
alex clarke (OOO till 29th)
2016/12/06 17:37:54
Done.
|
+ // Note a call to OnImmediateWorkQueueHasBecomeEmpty could have got here first |
+ // so there may not actually be any work to do. |
+ if (!main_thread_only().immediate_work_queue->Empty()) |
+ return; |
+ |
+ base::AutoLock lock(any_thread_lock_); |
+ if (any_thread().immediate_incoming_queue.empty()) |
+ return; |
+ |
+ main_thread_only().immediate_work_queue->SwapLocked( |
+ any_thread().immediate_incoming_queue); |
+} |
+ |
+void TaskQueueImpl::OnImmediateWorkQueueHasBecomeEmpty( |
+ std::queue<TaskQueueImpl::Task>* work_queue) { |
+ base::AutoLock lock(any_thread_lock_); |
+ DCHECK(work_queue->empty()); |
+ |
+ if (any_thread().immediate_incoming_queue.empty()) |
+ return; |
+ |
+ std::swap(any_thread().immediate_incoming_queue, *work_queue); |
+} |
+ |
bool TaskQueueImpl::IsEmpty() const { |
if (!main_thread_only().delayed_work_queue->Empty() || |
!main_thread_only().delayed_incoming_queue.empty() || |
@@ -420,20 +442,6 @@ void TaskQueueImpl::WakeUpForDelayedWork(LazyNow* lazy_now) { |
} |
} |
-bool TaskQueueImpl::MaybeUpdateImmediateWorkQueues() { |
- if (!main_thread_only().task_queue_manager) |
- return false; |
- |
- if (!main_thread_only().immediate_work_queue->Empty()) |
- return true; |
- |
- base::AutoLock lock(any_thread_lock_); |
- main_thread_only().immediate_work_queue->SwapLocked( |
- any_thread().immediate_incoming_queue); |
- // |immediate_work_queue| is now empty so updates are no longer required. |
- return false; |
-} |
- |
void TaskQueueImpl::TraceQueueSize(bool is_locked) const { |
bool is_tracing; |
TRACE_EVENT_CATEGORY_GROUP_ENABLED(disabled_by_default_tracing_category_, |
@@ -574,8 +582,7 @@ void TaskQueueImpl::SetTimeDomain(TimeDomain* time_domain) { |
any_thread().time_domain = time_domain; |
} |
- // We rely here on TimeDomain::MigrateQueue being thread-safe to use with |
- // TimeDomain::Register/UnregisterAsUpdatableTaskQueue. |
+ |
main_thread_only().time_domain->MigrateQueue(this, time_domain); |
main_thread_only().time_domain = time_domain; |
} |
@@ -671,6 +678,8 @@ bool TaskQueueImpl::BlockedByFence() const { |
} |
bool TaskQueueImpl::BlockedByFenceLocked() const { |
+ any_thread_lock_.AssertAcquired(); |
+ |
if (!main_thread_only().current_fence) |
return false; |