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

Side by Side Diff: base/task_scheduler/delayed_task_manager.cc

Issue 1685423002: Task Scheduler. (Closed) Base URL: https://luckyluke-private.googlesource.com/src@a_master
Patch Set: Created 4 years, 10 months 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 2016 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 "base/task_scheduler/delayed_task_manager.h"
6
7 #include <vector>
8
9 #include "base/logging.h"
10 #include "base/task_scheduler/utils.h"
11
12 namespace base {
13 namespace task_scheduler {
14
15 DelayedTaskManager::DelayedTaskManager(const Closure& delayed_run_time_changed,
16 ShutdownManager* shutdown_manager)
17 : next_delayed_task_index_(0),
18 delayed_run_time_changed_(delayed_run_time_changed),
19 shutdown_manager_(shutdown_manager) {
20 DCHECK(!delayed_run_time_changed_.is_null());
21 DCHECK(shutdown_manager_);
22 }
23
24 DelayedTaskManager::~DelayedTaskManager() = default;
25
26 void DelayedTaskManager::AddDelayedTask(const Task& task,
27 scoped_refptr<Sequence> sequence,
28 PriorityQueue* priority_queue) {
29 DCHECK_NE(TimeTicks(), task.delayed_run_time);
fdoray 2016/02/11 17:30:32 DCHECK(sequence.get()); DCHECK(priority_queue);
fdoray 2016/02/12 04:16:19 Done.
30
31 TimeTicks previous_delayed_run_time;
32
33 {
34 AutoSchedulerLock auto_lock(lock_);
35
36 DelayedTask delayed_task;
37 delayed_task.task = task;
38 delayed_task.sequence = sequence;
39 delayed_task.priority_queue = priority_queue;
40 delayed_task.index = next_delayed_task_index_;
41 ++next_delayed_task_index_;
42
43 if (!delayed_tasks_.empty())
44 previous_delayed_run_time = delayed_tasks_.top().task.delayed_run_time;
45
46 delayed_tasks_.push(delayed_task);
47 }
48
49 if (previous_delayed_run_time.is_null() ||
50 task.delayed_run_time < previous_delayed_run_time) {
51 delayed_run_time_changed_.Run();
52 }
53 }
54
55 void DelayedTaskManager::PostReadyTasks() {
56 // Get delayed tasks that are ready for execution. Don't post them right away
57 // to avoid holding 2 locks at the same time.
fdoray 2016/02/11 17:30:32 multiple locks
fdoray 2016/02/12 04:16:19 Done.
58 TimeTicks now = Now();
fdoray 2016/02/11 17:30:32 const TimeTicks now = Now();
fdoray 2016/02/12 04:16:19 Done.
59 std::vector<DelayedTask> ready_tasks;
60
61 {
62 AutoSchedulerLock auto_lock(lock_);
63 while (!delayed_tasks_.empty() &&
64 delayed_tasks_.top().task.delayed_run_time <= now) {
65 ready_tasks.push_back(delayed_tasks_.top());
66 delayed_tasks_.pop();
67 }
68 }
69
70 // Post delayed tasks that are ready for execution.
71 for (const auto& delayed_task : ready_tasks) {
72 PostTaskNowHelper(delayed_task.task, delayed_task.sequence,
73 delayed_task.priority_queue, shutdown_manager_);
74 }
75 }
76
77 TimeTicks DelayedTaskManager::GetNextDelayedTaskReadyTime() const {
78 AutoSchedulerLock auto_lock(lock_);
79
80 if (delayed_tasks_.empty())
81 return TimeTicks();
82
83 return delayed_tasks_.top().task.delayed_run_time;
84 }
85
86 TimeTicks DelayedTaskManager::Now() {
87 return TimeTicks::Now();
88 }
89
90 DelayedTaskManager::DelayedTask::DelayedTask() = default;
91
92 DelayedTaskManager::DelayedTask::~DelayedTask() = default;
93
94 bool DelayedTaskManager::DelayedTask::operator<(
95 const DelayedTask& other) const {
96 if (task.delayed_run_time > other.task.delayed_run_time)
97 return true;
98 if (task.delayed_run_time < other.task.delayed_run_time)
99 return false;
100 return index > other.index;
101 }
102
103 } // namespace task_scheduler
104 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698