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

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

Issue 1704113002: TaskScheduler [6] SchedulerWorkerThread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@s_4_shutdown
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 internal {
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);
30 DCHECK(sequence.get());
31 DCHECK(priority_queue);
32
33 TimeTicks previous_delayed_run_time;
34
35 {
36 AutoSchedulerLock auto_lock(lock_);
37
38 DelayedTask delayed_task;
39 delayed_task.task = task;
40 delayed_task.sequence = sequence;
41 delayed_task.priority_queue = priority_queue;
42 delayed_task.index = next_delayed_task_index_;
43 ++next_delayed_task_index_;
44
45 if (!delayed_tasks_.empty())
46 previous_delayed_run_time = delayed_tasks_.top().task.delayed_run_time;
47
48 delayed_tasks_.push(delayed_task);
49 }
50
51 if (previous_delayed_run_time.is_null() ||
52 task.delayed_run_time < previous_delayed_run_time) {
53 delayed_run_time_changed_.Run();
54 }
55 }
56
57 void DelayedTaskManager::PostReadyTasks() {
58 // Get delayed tasks that are ready for execution. Don't post them right away
59 // to avoid holding multiple locks at the same time.
60 const TimeTicks now = Now();
61 std::vector<DelayedTask> ready_tasks;
62
63 {
64 AutoSchedulerLock auto_lock(lock_);
65 while (!delayed_tasks_.empty() &&
66 delayed_tasks_.top().task.delayed_run_time <= now) {
67 ready_tasks.push_back(delayed_tasks_.top());
68 delayed_tasks_.pop();
69 }
70 }
71
72 // Post delayed tasks that are ready for execution.
73 for (const auto& delayed_task : ready_tasks) {
74 PostTaskNowHelper(delayed_task.task, delayed_task.sequence,
75 delayed_task.priority_queue, shutdown_manager_);
76 }
77 }
78
79 TimeTicks DelayedTaskManager::GetNextDelayedRunTime() const {
80 AutoSchedulerLock auto_lock(lock_);
81
82 if (delayed_tasks_.empty())
83 return TimeTicks();
84
85 return delayed_tasks_.top().task.delayed_run_time;
86 }
87
88 TimeTicks DelayedTaskManager::Now() {
89 return TimeTicks::Now();
90 }
91
92 DelayedTaskManager::DelayedTask::DelayedTask() = default;
93
94 DelayedTaskManager::DelayedTask::~DelayedTask() = default;
95
96 bool DelayedTaskManager::DelayedTask::operator<(
97 const DelayedTask& other) const {
98 if (task.delayed_run_time > other.task.delayed_run_time)
99 return true;
100 if (task.delayed_run_time < other.task.delayed_run_time)
101 return false;
102 return index > other.index;
103 }
104
105 } // namespace internal
106 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698