Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/scheduler/renderer/task_queue_throttler.h" | 5 #include "platform/scheduler/renderer/task_queue_throttler.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 base::TimeDelta::FromMilliseconds(1200.0)); | 194 base::TimeDelta::FromMilliseconds(1200.0)); |
| 195 | 195 |
| 196 timer_queue_->PostDelayedTask(FROM_HERE, | 196 timer_queue_->PostDelayedTask(FROM_HERE, |
| 197 base::Bind(&TestTask, &run_times, clock_.get()), | 197 base::Bind(&TestTask, &run_times, clock_.get()), |
| 198 base::TimeDelta::FromMilliseconds(8300.0)); | 198 base::TimeDelta::FromMilliseconds(8300.0)); |
| 199 | 199 |
| 200 task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); | 200 task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); |
| 201 | 201 |
| 202 mock_task_runner_->RunUntilIdle(); | 202 mock_task_runner_->RunUntilIdle(); |
| 203 | 203 |
| 204 // Times are aligned to a multipple of 1000 milliseconds. | 204 // Times are aligned to a multiple of 1000 milliseconds. |
| 205 EXPECT_THAT( | 205 EXPECT_THAT( |
| 206 run_times, | 206 run_times, |
| 207 ElementsAre( | 207 ElementsAre( |
| 208 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000.0), | 208 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000.0), |
| 209 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000.0), | 209 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000.0), |
| 210 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2000.0), | 210 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2000.0), |
| 211 base::TimeTicks() + base::TimeDelta::FromMilliseconds(9000.0))); | 211 base::TimeTicks() + base::TimeDelta::FromMilliseconds(9000.0))); |
| 212 } | 212 } |
| 213 | 213 |
| 214 TEST_F(TaskQueueThrottlerTest, TimerAlignment_Unthrottled) { | 214 TEST_F(TaskQueueThrottlerTest, TimerAlignment_Unthrottled) { |
| (...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1048 | 1048 |
| 1049 EXPECT_THAT( | 1049 EXPECT_THAT( |
| 1050 run_times, | 1050 run_times, |
| 1051 ElementsAre( | 1051 ElementsAre( |
| 1052 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000), | 1052 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000), |
| 1053 base::TimeTicks() + base::TimeDelta::FromMilliseconds(3000), | 1053 base::TimeTicks() + base::TimeDelta::FromMilliseconds(3000), |
| 1054 base::TimeTicks() + base::TimeDelta::FromMilliseconds(6000), | 1054 base::TimeTicks() + base::TimeDelta::FromMilliseconds(6000), |
| 1055 base::TimeTicks() + base::TimeDelta::FromMilliseconds(26000))); | 1055 base::TimeTicks() + base::TimeDelta::FromMilliseconds(26000))); |
| 1056 } | 1056 } |
| 1057 | 1057 |
| 1058 namespace { | |
| 1059 void RunChainedTask(size_t run_times_count, | |
| 1060 scoped_refptr<TaskQueue> queue, | |
| 1061 base::SimpleTestTickClock* clock, | |
| 1062 base::TimeDelta task_duration, | |
| 1063 std::vector<base::TimeTicks>* run_times) { | |
| 1064 run_times->push_back(clock->NowTicks()); | |
| 1065 clock->Advance(task_duration); | |
| 1066 | |
| 1067 if (run_times_count <= 1) | |
| 1068 return; | |
| 1069 | |
| 1070 queue->PostTask(FROM_HERE, | |
| 1071 base::Bind(&RunChainedTask, run_times_count - 1, queue, clock, | |
| 1072 task_duration, run_times)); | |
| 1073 } | |
| 1074 | |
| 1075 void RunChainedDelayedTask(size_t run_times_count, | |
| 1076 scoped_refptr<TaskQueue> queue, | |
| 1077 base::SimpleTestTickClock* clock, | |
| 1078 base::TimeDelta task_duration, | |
| 1079 std::vector<base::TimeTicks>* run_times, | |
| 1080 base::TimeDelta delay) { | |
| 1081 run_times->push_back(clock->NowTicks()); | |
| 1082 clock->Advance(task_duration); | |
| 1083 | |
| 1084 if (run_times_count <= 1) | |
| 1085 return; | |
| 1086 | |
| 1087 queue->PostDelayedTask( | |
| 1088 FROM_HERE, | |
| 1089 base::Bind(&RunChainedDelayedTask, run_times_count - 1, queue, clock, | |
| 1090 task_duration, run_times, delay), | |
| 1091 delay); | |
| 1092 } | |
| 1093 } // namespace | |
| 1094 | |
| 1095 TEST_F(TaskQueueThrottlerTest, | |
| 1096 WakeUpBasedThrottling_ChainedTasks_Instantaneous) { | |
| 1097 scheduler_->GetWakeUpBudgetPoolForTesting()->SetWakeUpDuration( | |
| 1098 base::TimeDelta::FromMilliseconds(10)); | |
| 1099 std::vector<base::TimeTicks> run_times; | |
| 1100 | |
| 1101 task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); | |
| 1102 | |
| 1103 timer_queue_->PostDelayedTask( | |
| 1104 FROM_HERE, | |
| 1105 base::Bind(&RunChainedTask, 10, timer_queue_, clock_.get(), | |
|
Sami
2017/04/26 13:09:08
Should we make this 10 larger to check that we onl
altimin
2017/04/26 14:31:30
I'm not quite sure what you mean here. There tasks
Sami
2017/04/27 12:12:30
Ah yes, you're right.
| |
| 1106 base::TimeDelta(), &run_times), | |
| 1107 base::TimeDelta::FromMilliseconds(100)); | |
| 1108 | |
| 1109 mock_task_runner_->RunUntilIdle(); | |
| 1110 | |
| 1111 EXPECT_THAT(run_times, | |
| 1112 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1113 base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1114 base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1115 base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1116 base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1117 base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1118 base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1119 base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1120 base::TimeTicks() + base::TimeDelta::FromSeconds(1), | |
| 1121 base::TimeTicks() + base::TimeDelta::FromSeconds(1))); | |
| 1122 } | |
| 1123 | |
| 1124 TEST_F(TaskQueueThrottlerTest, WakeUpBasedThrottling_ImmediateTasks_Fast) { | |
| 1125 scheduler_->GetWakeUpBudgetPoolForTesting()->SetWakeUpDuration( | |
| 1126 base::TimeDelta::FromMilliseconds(10)); | |
| 1127 std::vector<base::TimeTicks> run_times; | |
| 1128 | |
| 1129 task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); | |
| 1130 | |
| 1131 timer_queue_->PostDelayedTask( | |
| 1132 FROM_HERE, | |
| 1133 base::Bind(&RunChainedTask, 10, timer_queue_, clock_.get(), | |
| 1134 base::TimeDelta::FromMilliseconds(3), &run_times), | |
| 1135 base::TimeDelta::FromMilliseconds(100)); | |
| 1136 | |
| 1137 mock_task_runner_->RunUntilIdle(); | |
| 1138 | |
| 1139 // TODO(altimin): Add fence mechanism to block immediate tasks. | |
|
Sami
2017/04/26 13:09:08
Just curious, how do interleaved immediate tasks w
altimin
2017/04/26 14:31:30
The fence is installed, but it is too late, so one
| |
| 1140 EXPECT_THAT( | |
| 1141 run_times, | |
| 1142 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000), | |
| 1143 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1003), | |
| 1144 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1006), | |
| 1145 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1009), | |
| 1146 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1012), | |
| 1147 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2000), | |
| 1148 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2003), | |
| 1149 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2006), | |
| 1150 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2009), | |
| 1151 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2012))); | |
| 1152 } | |
| 1153 | |
| 1154 TEST_F(TaskQueueThrottlerTest, WakeUpBasedThrottling_DelayedTasks) { | |
| 1155 scheduler_->GetWakeUpBudgetPoolForTesting()->SetWakeUpDuration( | |
| 1156 base::TimeDelta::FromMilliseconds(10)); | |
| 1157 std::vector<base::TimeTicks> run_times; | |
| 1158 | |
| 1159 task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); | |
| 1160 | |
| 1161 timer_queue_->PostDelayedTask( | |
| 1162 FROM_HERE, | |
| 1163 base::Bind(&RunChainedDelayedTask, 10, timer_queue_, clock_.get(), | |
| 1164 base::TimeDelta(), &run_times, | |
| 1165 base::TimeDelta::FromMilliseconds(3)), | |
| 1166 base::TimeDelta::FromMilliseconds(100)); | |
| 1167 | |
| 1168 mock_task_runner_->RunUntilIdle(); | |
| 1169 | |
| 1170 EXPECT_THAT( | |
| 1171 run_times, | |
| 1172 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000), | |
| 1173 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1003), | |
| 1174 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1006), | |
| 1175 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1009), | |
| 1176 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2000), | |
| 1177 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2003), | |
| 1178 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2006), | |
| 1179 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2009), | |
| 1180 base::TimeTicks() + base::TimeDelta::FromMilliseconds(3000), | |
| 1181 base::TimeTicks() + base::TimeDelta::FromMilliseconds(3003))); | |
| 1182 } | |
| 1183 | |
| 1058 } // namespace scheduler | 1184 } // namespace scheduler |
| 1059 } // namespace blink | 1185 } // namespace blink |
| OLD | NEW |