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 "platform/scheduler/base/task_queue_manager.h" | 5 #include "platform/scheduler/base/task_queue_manager.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/format_macros.h" | |
| 11 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
| 13 #include "base/strings/stringprintf.h" | |
| 12 #include "base/trace_event/trace_event.h" | 14 #include "base/trace_event/trace_event.h" |
| 13 #include "platform/scheduler/base/real_time_domain.h" | 15 #include "platform/scheduler/base/real_time_domain.h" |
| 14 #include "platform/scheduler/base/task_queue_impl.h" | 16 #include "platform/scheduler/base/task_queue_impl.h" |
| 15 #include "platform/scheduler/base/task_queue_manager_delegate.h" | 17 #include "platform/scheduler/base/task_queue_manager_delegate.h" |
| 16 #include "platform/scheduler/base/task_queue_selector.h" | 18 #include "platform/scheduler/base/task_queue_selector.h" |
| 17 #include "platform/scheduler/base/work_queue.h" | 19 #include "platform/scheduler/base/work_queue.h" |
| 18 #include "platform/scheduler/base/work_queue_sets.h" | 20 #include "platform/scheduler/base/work_queue_sets.h" |
| 19 #include "public/platform/scheduler/base/task_time_observer.h" | 21 #include "public/platform/scheduler/base/task_time_observer.h" |
| 20 | 22 |
| 21 namespace blink { | 23 namespace blink { |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 41 | 43 |
| 42 // Converts a OnceClosure to a RepeatingClosure. It hits CHECK failure to run | 44 // Converts a OnceClosure to a RepeatingClosure. It hits CHECK failure to run |
| 43 // the resulting RepeatingClosure more than once. | 45 // the resulting RepeatingClosure more than once. |
| 44 // TODO(tzik): This will be unneeded after the Closure-to-OnceClosure migration | 46 // TODO(tzik): This will be unneeded after the Closure-to-OnceClosure migration |
| 45 // on TaskRunner finished. Remove it once it gets unneeded. | 47 // on TaskRunner finished. Remove it once it gets unneeded. |
| 46 base::RepeatingClosure UnsafeConvertOnceClosureToRepeating( | 48 base::RepeatingClosure UnsafeConvertOnceClosureToRepeating( |
| 47 base::OnceClosure cb) { | 49 base::OnceClosure cb) { |
| 48 return base::BindRepeating([](base::OnceClosure cb) { std::move(cb).Run(); }, | 50 return base::BindRepeating([](base::OnceClosure cb) { std::move(cb).Run(); }, |
| 49 base::Passed(&cb)); | 51 base::Passed(&cb)); |
| 50 } | 52 } |
| 53 | |
| 54 std::string PointerToId(void* pointer) { | |
|
alex clarke (OOO till 29th)
2016/11/24 14:45:07
Can we land this separately? It seems unrelated t
altimin
2016/11/24 15:00:55
Oops, sorry.
| |
| 55 return base::StringPrintf( | |
| 56 "%" PRIx64, static_cast<uint64_t>(reinterpret_cast<uintptr_t>(pointer))); | |
| 51 } | 57 } |
| 52 | 58 |
| 59 } // namespace | |
| 60 | |
| 53 TaskQueueManager::TaskQueueManager( | 61 TaskQueueManager::TaskQueueManager( |
| 54 scoped_refptr<TaskQueueManagerDelegate> delegate, | 62 scoped_refptr<TaskQueueManagerDelegate> delegate, |
| 55 const char* tracing_category, | 63 const char* tracing_category, |
| 56 const char* disabled_by_default_tracing_category, | 64 const char* disabled_by_default_tracing_category, |
| 57 const char* disabled_by_default_verbose_tracing_category) | 65 const char* disabled_by_default_verbose_tracing_category) |
| 58 : real_time_domain_(new RealTimeDomain(tracing_category)), | 66 : real_time_domain_(new RealTimeDomain(tracing_category)), |
| 59 delegate_(delegate), | 67 delegate_(delegate), |
| 60 task_was_run_on_quiescence_monitored_queue_(false), | 68 task_was_run_on_quiescence_monitored_queue_(false), |
| 61 other_thread_pending_wakeup_(false), | 69 other_thread_pending_wakeup_(false), |
| 62 work_batch_size_(1), | 70 work_batch_size_(1), |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 340 | 348 |
| 341 MaybeRecordTaskDelayHistograms(pending_task, queue); | 349 MaybeRecordTaskDelayHistograms(pending_task, queue); |
| 342 | 350 |
| 343 TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue", | 351 TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue", |
| 344 pending_task); | 352 pending_task); |
| 345 if (queue->GetShouldNotifyObservers()) { | 353 if (queue->GetShouldNotifyObservers()) { |
| 346 for (auto& observer : task_observers_) | 354 for (auto& observer : task_observers_) |
| 347 observer.WillProcessTask(pending_task); | 355 observer.WillProcessTask(pending_task); |
| 348 queue->NotifyWillProcessTask(pending_task); | 356 queue->NotifyWillProcessTask(pending_task); |
| 349 } | 357 } |
| 350 TRACE_EVENT1(tracing_category_, "TaskQueueManager::RunTask", "queue", | 358 TRACE_EVENT2(tracing_category_, "TaskQueueManager::RunTask", "queue", |
| 351 queue->GetName()); | 359 queue->GetName(), "queue_id", PointerToId(queue)); |
| 352 // NOTE when TaskQueues get unregistered a reference ends up getting retained | 360 // NOTE when TaskQueues get unregistered a reference ends up getting retained |
| 353 // by |queues_to_delete_| which is cleared at the top of |DoWork|. This means | 361 // by |queues_to_delete_| which is cleared at the top of |DoWork|. This means |
| 354 // we are OK to use raw pointers here. | 362 // we are OK to use raw pointers here. |
| 355 internal::TaskQueueImpl* prev_executing_task_queue = | 363 internal::TaskQueueImpl* prev_executing_task_queue = |
| 356 currently_executing_task_queue_; | 364 currently_executing_task_queue_; |
| 357 currently_executing_task_queue_ = queue; | 365 currently_executing_task_queue_ = queue; |
| 358 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); | 366 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); |
| 359 // Detect if the TaskQueueManager just got deleted. If this happens we must | 367 // Detect if the TaskQueueManager just got deleted. If this happens we must |
| 360 // not access any member variables after this point. | 368 // not access any member variables after this point. |
| 361 if (protect->HasOneRef()) | 369 if (protect->HasOneRef()) |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 490 *work_queue->GetFrontTask()); | 498 *work_queue->GetFrontTask()); |
| 491 } | 499 } |
| 492 } | 500 } |
| 493 | 501 |
| 494 bool TaskQueueManager::HasImmediateWorkForTesting() const { | 502 bool TaskQueueManager::HasImmediateWorkForTesting() const { |
| 495 return !selector_.EnabledWorkQueuesEmpty(); | 503 return !selector_.EnabledWorkQueuesEmpty(); |
| 496 } | 504 } |
| 497 | 505 |
| 498 } // namespace scheduler | 506 } // namespace scheduler |
| 499 } // namespace blink | 507 } // namespace blink |
| OLD | NEW |