Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(408)

Unified Diff: components/scheduler/base/task_queue_impl.cc

Issue 1432263002: (reland) Adds TimeDomains to the TaskQueueManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/scheduler/base/task_queue_impl.cc
diff --git a/components/scheduler/base/task_queue_impl.cc b/components/scheduler/base/task_queue_impl.cc
index 651770740e8a2f7ba6527c25fd042425b0eba6ea..ff349e38df350095095d2d5cb75c8c9dd9adc4dc 100644
--- a/components/scheduler/base/task_queue_impl.cc
+++ b/components/scheduler/base/task_queue_impl.cc
@@ -4,6 +4,7 @@
#include "components/scheduler/base/task_queue_impl.h"
+#include "components/scheduler/base/delayed_task_delegate.h"
#include "components/scheduler/base/task_queue_manager.h"
#include "components/scheduler/base/task_queue_manager_delegate.h"
@@ -12,11 +13,12 @@ namespace internal {
TaskQueueImpl::TaskQueueImpl(
TaskQueueManager* task_queue_manager,
+ const scoped_refptr<DelayedTaskDelegate>& delayed_task_delegate,
const Spec& spec,
const char* disabled_by_default_tracing_category,
const char* disabled_by_default_verbose_tracing_category)
: thread_id_(base::PlatformThread::CurrentId()),
- any_thread_(task_queue_manager, spec.pump_policy),
+ any_thread_(task_queue_manager, spec.pump_policy, delayed_task_delegate),
name_(spec.name),
disabled_by_default_tracing_category_(
disabled_by_default_tracing_category),
@@ -53,9 +55,13 @@ TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from,
sequence_num = sequence_number;
}
-TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager,
- PumpPolicy pump_policy)
- : task_queue_manager(task_queue_manager), pump_policy(pump_policy) {}
+TaskQueueImpl::AnyThread::AnyThread(
+ TaskQueueManager* task_queue_manager,
+ PumpPolicy pump_policy,
+ const scoped_refptr<DelayedTaskDelegate>& delayed_task_delegate)
+ : task_queue_manager(task_queue_manager),
+ pump_policy(pump_policy),
+ delayed_task_delegate(delayed_task_delegate) {}
TaskQueueImpl::AnyThread::~AnyThread() {}
@@ -70,6 +76,9 @@ void TaskQueueImpl::UnregisterTaskQueue() {
base::AutoLock lock(any_thread_lock_);
if (!any_thread().task_queue_manager)
return;
+
+ any_thread().delayed_task_delegate->CancelDelayedWork(this);
+ any_thread().delayed_task_delegate = scoped_refptr<DelayedTaskDelegate>();
Sami 2015/11/17 10:31:06 nit: I think there's a release() or reset() for th
alex clarke (OOO till 29th) 2015/11/18 15:30:15 I can't see anything like that on scoped_refptr
any_thread().task_queue_manager->UnregisterTaskQueue(this);
any_thread().task_queue_manager = nullptr;
@@ -104,8 +113,8 @@ bool TaskQueueImpl::PostDelayedTaskAt(
base::AutoLock lock(any_thread_lock_);
if (!any_thread().task_queue_manager)
return false;
- LazyNow lazy_now(any_thread().task_queue_manager->delegate().get());
- return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time,
+ any_thread().delayed_task_delegate->InvalidateNowCache();
+ return PostDelayedTaskLocked(from_here, task, desired_run_time,
TaskType::NORMAL);
}
@@ -117,16 +126,14 @@ bool TaskQueueImpl::PostDelayedTaskImpl(
base::AutoLock lock(any_thread_lock_);
if (!any_thread().task_queue_manager)
return false;
- LazyNow lazy_now(any_thread().task_queue_manager->delegate().get());
base::TimeTicks desired_run_time;
+ any_thread().delayed_task_delegate->InvalidateNowCache();
if (delay > base::TimeDelta())
- desired_run_time = lazy_now.Now() + delay;
- return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time,
- task_type);
+ desired_run_time = any_thread().delayed_task_delegate->CachedNow() + delay;
+ return PostDelayedTaskLocked(from_here, task, desired_run_time, task_type);
}
bool TaskQueueImpl::PostDelayedTaskLocked(
- LazyNow* lazy_now,
const tracked_objects::Location& from_here,
const base::Closure& task,
base::TimeTicks desired_run_time,
@@ -138,13 +145,14 @@ bool TaskQueueImpl::PostDelayedTaskLocked(
any_thread().task_queue_manager->DidQueueTask(pending_task);
if (!desired_run_time.is_null()) {
- pending_task.delayed_run_time = std::max(lazy_now->Now(), desired_run_time);
+ pending_task.delayed_run_time = std::max(
+ any_thread().delayed_task_delegate->CachedNow(), desired_run_time);
// TODO(alexclarke): consider emplace() when C++11 library features allowed.
any_thread().delayed_task_queue.push(pending_task);
TraceQueueSize(true);
// Schedule a later call to MoveReadyDelayedTasksToIncomingQueue.
- any_thread().task_queue_manager->ScheduleDelayedWork(this, desired_run_time,
- lazy_now);
+ any_thread().delayed_task_delegate->ScheduleDelayedWork(this,
+ desired_run_time);
return true;
}
pending_task.set_enqueue_order(pending_task.sequence_num);
@@ -152,20 +160,19 @@ bool TaskQueueImpl::PostDelayedTaskLocked(
return true;
}
-void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue(LazyNow* lazy_now) {
+void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue() {
base::AutoLock lock(any_thread_lock_);
if (!any_thread().task_queue_manager)
return;
- MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now);
+ MoveReadyDelayedTasksToIncomingQueueLocked();
}
-void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked(
- LazyNow* lazy_now) {
+void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked() {
// Enqueue all delayed tasks that should be running now.
while (!any_thread().delayed_task_queue.empty() &&
any_thread().delayed_task_queue.top().delayed_run_time <=
- lazy_now->Now()) {
+ any_thread().delayed_task_delegate->CachedNow()) {
// TODO(alexclarke): consider std::move() when allowed.
EnqueueDelayedTaskLocked(any_thread().delayed_task_queue.top());
any_thread().delayed_task_queue.pop();
@@ -232,14 +239,13 @@ bool TaskQueueImpl::NextPendingDelayedTaskRunTime(
return true;
}
-void TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now,
- bool should_trigger_wakeup,
+void TaskQueueImpl::UpdateWorkQueue(bool should_trigger_wakeup,
const Task* previous_task) {
DCHECK(main_thread_only().work_queue.empty());
base::AutoLock lock(any_thread_lock_);
if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task))
return;
- MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now);
+ MoveReadyDelayedTasksToIncomingQueueLocked();
std::swap(main_thread_only().work_queue, any_thread().incoming_queue);
// |any_thread().incoming_queue| is now empty so
// TaskQueueManager::UpdateQueues no longer needs to consider
@@ -322,8 +328,8 @@ void TaskQueueImpl::PumpQueueLocked() {
if (!any_thread().task_queue_manager)
return;
- LazyNow lazy_now(any_thread().task_queue_manager->delegate().get());
- MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now);
+ any_thread().delayed_task_delegate->InvalidateNowCache();
+ MoveReadyDelayedTasksToIncomingQueueLocked();
bool was_empty = main_thread_only().work_queue.empty();
while (!any_thread().incoming_queue.empty()) {
@@ -516,5 +522,10 @@ void TaskQueueImpl::TaskAsValueInto(const Task& task,
state->EndDictionary();
}
+size_t TaskQueueImpl::IncommingQueueSizeForTest() const {
+ base::AutoLock lock(any_thread_lock_);
+ return any_thread().incoming_queue.size();
+}
+
} // namespace internal
} // namespace scheduler

Powered by Google App Engine
This is Rietveld 408576698