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

Side by Side Diff: components/scheduler/base/delayed_task_delegate.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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/scheduler/base/delayed_task_delegate.h"
6
7 #include <set>
8
9 #include "components/scheduler/base/task_queue_impl.h"
10 #include "components/scheduler/base/task_queue_manager_delegate.h"
11 #include "components/scheduler/scheduler_export.h"
12
13 namespace scheduler {
14
15 DelayedTaskDelegate::DelayedTaskDelegate() {}
16
17 DelayedTaskDelegate::~DelayedTaskDelegate() {}
18
19 void DelayedTaskDelegate::ScheduleDelayedWork(
20 internal::TaskQueueImpl* queue,
21 base::TimeTicks delayed_run_time) {
22 if (!BelongsToCurrentThread()) {
23 // NOTE posting a delayed task from a different thread is not expected to be
24 // common. This pathway is less optimal than perhaps it could be because
25 // it causes two main thread tasks to be run. Should this assumption prove
26 // to be false in future, we may need to revisit this.
27 PostScheduleDelayedWorkTaskOnMainThread(queue, delayed_run_time);
28 return;
29 }
30
31 // Make sure there's one (and only one) task posted to |delegate_|
32 // to call |DelayedDoWork| at |delayed_run_time|.
33 if (delayed_wakeup_multimap_.find(delayed_run_time) ==
34 delayed_wakeup_multimap_.end()) {
35 base::TimeDelta delay =
36 std::max(base::TimeDelta(), delayed_run_time - CachedNow());
37 ScheduleDoWork(delay);
38 }
39 delayed_wakeup_multimap_.insert(std::make_pair(delayed_run_time, queue));
40 }
41
42 void DelayedTaskDelegate::ScheduleDelayedWorkTask(
43 scoped_refptr<internal::TaskQueueImpl> queue,
44 base::TimeTicks delayed_run_time) {
45 InvalidateNowCache();
46 ScheduleDelayedWork(queue.get(), delayed_run_time);
47 }
48
49 void DelayedTaskDelegate::CancelDelayedWork(internal::TaskQueueImpl* queue) {
50 // We need to remove |task_queue| from delayed_wakeup_multimap_ which is a
51 // little awkward since it's keyed by time. O(n) running time.
52 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_multimap_.begin();
53 iter != delayed_wakeup_multimap_.end();) {
54 if (iter->second == queue) {
55 DelayedWakeupMultimap::iterator temp = iter;
56 iter++;
57 // O(1) amortized.
58 delayed_wakeup_multimap_.erase(temp);
59 } else {
60 iter++;
61 }
62 }
63 }
64
65 void DelayedTaskDelegate::WakeupReadyDelayedQueues() {
66 // Wake up any queues with pending delayed work. Note std::multipmap stores
67 // the elements sorted by key, so the begin() iterator points to the earliest
68 // queue to wakeup.
69 std::set<internal::TaskQueueImpl*> dedup_set;
70 while (!delayed_wakeup_multimap_.empty()) {
71 DelayedWakeupMultimap::iterator next_wakeup =
72 delayed_wakeup_multimap_.begin();
73 if (next_wakeup->first > CachedNow())
74 break;
75 // A queue could have any number of delayed tasks pending so it's worthwhile
76 // deduping calls to MoveReadyDelayedTasksToIncomingQueue since it takes a
77 // lock. NOTE the order in which these are called matters since the order
78 // in which EnqueueTaskLocks is called is respected when choosing which
79 // queue to execute a task from.
80 if (dedup_set.insert(next_wakeup->second).second)
81 next_wakeup->second->MoveReadyDelayedTasksToIncomingQueue();
82 delayed_wakeup_multimap_.erase(next_wakeup);
83 }
84 }
85
86 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698