Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/renderer/scheduler/task_queue_manager.h" | 5 #include "content/renderer/scheduler/task_queue_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/debug/trace_event_argument.h" | |
| 9 #include "content/renderer/scheduler/task_queue_selector.h" | 10 #include "content/renderer/scheduler/task_queue_selector.h" |
| 10 | 11 |
| 11 namespace content { | 12 namespace content { |
| 12 namespace internal { | 13 namespace internal { |
| 13 | 14 |
| 14 class TaskQueue : public base::SingleThreadTaskRunner { | 15 class TaskQueue : public base::SingleThreadTaskRunner { |
| 15 public: | 16 public: |
| 16 TaskQueue(TaskQueueManager* task_queue_manager); | 17 TaskQueue(TaskQueueManager* task_queue_manager); |
| 17 | 18 |
| 18 // base::SingleThreadTaskRunner implementation. | 19 // base::SingleThreadTaskRunner implementation. |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 35 void SetAutoPump(bool auto_pump); | 36 void SetAutoPump(bool auto_pump); |
| 36 void PumpQueue(); | 37 void PumpQueue(); |
| 37 | 38 |
| 38 bool UpdateWorkQueue(); | 39 bool UpdateWorkQueue(); |
| 39 base::PendingTask TakeTaskFromWorkQueue(); | 40 base::PendingTask TakeTaskFromWorkQueue(); |
| 40 | 41 |
| 41 void WillDeleteTaskQueueManager(); | 42 void WillDeleteTaskQueueManager(); |
| 42 | 43 |
| 43 base::TaskQueue& work_queue() { return work_queue_; } | 44 base::TaskQueue& work_queue() { return work_queue_; } |
| 44 | 45 |
| 46 void AsValueInto(base::debug::TracedValue* state); | |
| 47 | |
| 45 private: | 48 private: |
| 46 virtual ~TaskQueue(); | 49 virtual ~TaskQueue(); |
| 47 | 50 |
| 48 void PumpQueueLocked(); | 51 void PumpQueueLocked(); |
| 49 void EnqueueTaskLocked(const base::PendingTask& pending_task); | 52 void EnqueueTaskLocked(const base::PendingTask& pending_task); |
| 50 | 53 |
| 51 // This lock protects all members except the work queue. | 54 // This lock protects all members except the work queue. |
| 52 mutable base::Lock lock_; | 55 mutable base::Lock lock_; |
| 53 TaskQueueManager* task_queue_manager_; | 56 TaskQueueManager* task_queue_manager_; |
| 54 base::TaskQueue incoming_queue_; | 57 base::TaskQueue incoming_queue_; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 } | 171 } |
| 169 if (!work_queue_.empty()) | 172 if (!work_queue_.empty()) |
| 170 task_queue_manager_->PostDoWorkOnMainRunner(); | 173 task_queue_manager_->PostDoWorkOnMainRunner(); |
| 171 } | 174 } |
| 172 | 175 |
| 173 void TaskQueue::PumpQueue() { | 176 void TaskQueue::PumpQueue() { |
| 174 base::AutoLock lock(lock_); | 177 base::AutoLock lock(lock_); |
| 175 PumpQueueLocked(); | 178 PumpQueueLocked(); |
| 176 } | 179 } |
| 177 | 180 |
| 178 } // namespace | 181 void TaskQueue::AsValueInto(base::debug::TracedValue* state) { |
| 182 base::AutoLock lock(lock_); | |
| 183 state->BeginDictionary(); | |
| 184 state->BeginArray("incoming_queue"); | |
| 185 TaskQueueManager::QueueAsValueInto(incoming_queue_, state); | |
| 186 state->EndArray(); | |
| 187 state->BeginArray("work_queue"); | |
| 188 TaskQueueManager::QueueAsValueInto(work_queue_, state); | |
| 189 state->EndArray(); | |
| 190 state->SetBoolean("auto_pump", auto_pump_); | |
| 191 state->EndDictionary(); | |
| 192 } | |
| 193 | |
| 194 } // namespace internal | |
| 179 | 195 |
| 180 TaskQueueManager::TaskQueueManager( | 196 TaskQueueManager::TaskQueueManager( |
| 181 size_t task_queue_count, | 197 size_t task_queue_count, |
| 182 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 198 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| 183 TaskQueueSelector* selector) | 199 TaskQueueSelector* selector) |
| 184 : main_task_runner_(main_task_runner), | 200 : main_task_runner_(main_task_runner), |
| 185 selector_(selector), | 201 selector_(selector), |
| 186 weak_factory_(this) { | 202 weak_factory_(this) { |
| 187 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); | 203 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); |
| 188 | 204 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 285 } | 301 } |
| 286 | 302 |
| 287 bool TaskQueueManager::PostNonNestableDelayedTask( | 303 bool TaskQueueManager::PostNonNestableDelayedTask( |
| 288 const tracked_objects::Location& from_here, | 304 const tracked_objects::Location& from_here, |
| 289 const base::Closure& task, | 305 const base::Closure& task, |
| 290 base::TimeDelta delay) { | 306 base::TimeDelta delay) { |
| 291 // Defer non-nestable work to the main task runner. | 307 // Defer non-nestable work to the main task runner. |
| 292 return main_task_runner_->PostNonNestableDelayedTask(from_here, task, delay); | 308 return main_task_runner_->PostNonNestableDelayedTask(from_here, task, delay); |
| 293 } | 309 } |
| 294 | 310 |
| 311 void TaskQueueManager::AsValueInto(base::debug::TracedValue* state) const { | |
| 312 main_thread_checker_.CalledOnValidThread(); | |
| 313 state->BeginArray("queues"); | |
| 314 for (auto& queue : queues_) | |
| 315 queue->AsValueInto(state); | |
| 316 state->EndArray(); | |
| 317 } | |
| 318 | |
| 319 // static | |
| 320 void TaskQueueManager::QueueAsValueInto(const base::TaskQueue& queue, | |
| 321 base::debug::TracedValue* state) { | |
| 322 base::TaskQueue queue_copy(queue); | |
| 323 state->BeginDictionary(); | |
| 324 state->BeginArray("tasks"); | |
| 325 while (!queue_copy.empty()) { | |
| 326 TaskAsValueInto(queue_copy.front(), state); | |
| 327 queue_copy.pop(); | |
| 328 } | |
| 329 state->EndArray(); | |
| 330 state->EndDictionary(); | |
| 331 } | |
| 332 | |
| 333 // static | |
| 334 void TaskQueueManager::TaskAsValueInto(const base::PendingTask& task, | |
| 335 base::debug::TracedValue* state) { | |
| 336 state->BeginDictionary(); | |
| 337 state->SetString("posted_from", task.posted_from.ToString()); | |
| 338 state->SetInteger("sequence_num", task.sequence_num); | |
|
picksi1
2014/10/28 11:01:40
do we need the underscores in the strings here?
Sami
2014/10/28 12:57:47
As opposed to camelCase? I think underscores are c
picksi1
2014/10/28 13:38:59
As opposed to spaces! I assume this string ends in
Sami
2014/10/28 13:42:00
You could have spaces here per the json spec, but
| |
| 339 state->SetBoolean("nestable", task.nestable); | |
| 340 state->SetBoolean("is_high_res", task.is_high_res); | |
| 341 state->SetDouble( | |
| 342 "time_posted", | |
| 343 (task.time_posted - base::TimeTicks()).InMicroseconds() / 1000.0L); | |
| 344 state->SetDouble( | |
|
picksi1
2014/10/28 11:01:40
ditto: InMillisecondsF?
Sami
2014/10/28 12:57:48
Done.
| |
| 345 "delayed_run_time", | |
| 346 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); | |
| 347 state->EndDictionary(); | |
| 348 } | |
| 349 | |
| 295 } // namespace content | 350 } // namespace content |
| OLD | NEW |