Chromium Code Reviews| Index: base/task_scheduler/task_tracker.cc |
| diff --git a/base/task_scheduler/task_tracker.cc b/base/task_scheduler/task_tracker.cc |
| index 07b0d1216db3ab529be9b6b5b754eb132913ae6d..ad1caeee9242ae2ccf9f8c2e43f517b37a9edccb 100644 |
| --- a/base/task_scheduler/task_tracker.cc |
| +++ b/base/task_scheduler/task_tracker.cc |
| @@ -5,6 +5,7 @@ |
| #include "base/task_scheduler/task_tracker.h" |
| #include <limits> |
| +#include <string> |
| #include "base/callback.h" |
| #include "base/debug/task_annotator.h" |
| @@ -18,6 +19,7 @@ |
| #include "base/threading/sequenced_task_runner_handle.h" |
| #include "base/threading/thread_restrictions.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| +#include "base/time/time.h" |
| #include "base/trace_event/trace_event.h" |
| #include "base/values.h" |
| @@ -71,6 +73,14 @@ const char kQueueFunctionName[] = "base::PostTask"; |
| // its implementation details. |
| const char kRunFunctionName[] = "TaskSchedulerRunTask"; |
| +HistogramBase* GetTaskLatencyHistogram(const char* suffix) { |
| + // Mimics the UMA_HISTOGRAM_TIMES macro. |
| + return Histogram::FactoryTimeGet( |
| + std::string("TaskScheduler.TaskLatency.") + suffix, |
| + TimeDelta::FromMilliseconds(1), TimeDelta::FromSeconds(10), 50, |
| + HistogramBase::kUmaTargetedHistogramFlag); |
| +} |
| + |
| // Upper bound for the |
| // TaskScheduler.BlockShutdownTasksPostedDuringShutdown histogram. |
| const HistogramBase::Sample kMaxBlockShutdownTasksPostedDuringShutdown = 1000; |
| @@ -174,7 +184,15 @@ class TaskTracker::State { |
| TaskTracker::TaskTracker() |
| : state_(new State), |
| flush_cv_(flush_lock_.CreateConditionVariable()), |
| - shutdown_lock_(&flush_lock_) {} |
| + shutdown_lock_(&flush_lock_), |
| + task_latency_histograms_{ |
| + {GetTaskLatencyHistogram("BackgroundTaskPriority"), |
| + GetTaskLatencyHistogram("BackgroundTaskPriority.MayBlock")}, |
| + {GetTaskLatencyHistogram("UserVisibleTaskPriority"), |
| + GetTaskLatencyHistogram("UserVisibleTaskPriority.MayBlock")}, |
| + {GetTaskLatencyHistogram("UserBlockingTaskPriority"), |
| + GetTaskLatencyHistogram("UserBlockingTaskPriority.MayBlock")}} {} |
|
gab
2017/01/05 19:25:46
// Confirm that all |task_latency_histograms_| hav
fdoray
2017/01/05 20:13:38
Done.
|
| + |
| TaskTracker::~TaskTracker() = default; |
| void TaskTracker::Shutdown() { |
| @@ -220,6 +238,8 @@ bool TaskTracker::RunTask(std::unique_ptr<Task> task, |
| const bool is_delayed = !task->delayed_run_time.is_null(); |
| if (can_run_task) { |
| + RecordTaskLatencyHistogram(task.get()); |
| + |
| const bool previous_singleton_allowed = |
| ThreadRestrictions::SetSingletonAllowed( |
| task->traits.shutdown_behavior() != |
| @@ -463,5 +483,15 @@ void TaskTracker::DecrementNumPendingUndelayedTasks() { |
| } |
| } |
| +void TaskTracker::RecordTaskLatencyHistogram(Task* task) { |
| + const TimeDelta task_latency = TimeTicks::Now() - task->sequenced_time; |
| + task_latency_histograms_[static_cast<int>(task->traits.priority())] |
| + [task->traits.may_block() || |
| + task->traits.with_base_sync_primitives() |
| + ? 1 |
| + : 0] |
| + ->AddTime(task_latency); |
| +} |
| + |
| } // namespace internal |
| } // namespace base |