| Index: base/task_scheduler/scheduler_worker_pool_impl.cc | 
| diff --git a/base/task_scheduler/scheduler_worker_pool_impl.cc b/base/task_scheduler/scheduler_worker_pool_impl.cc | 
| index 19833c812d9819c625d980725d5992b5c3e7e07c..f14e5f9249a550e102cfa72ef2944ad749fcf113 100644 | 
| --- a/base/task_scheduler/scheduler_worker_pool_impl.cc | 
| +++ b/base/task_scheduler/scheduler_worker_pool_impl.cc | 
| @@ -34,6 +34,8 @@ namespace { | 
| constexpr char kPoolNameSuffix[] = "Pool"; | 
| constexpr char kDetachDurationHistogramPrefix[] = | 
| "TaskScheduler.DetachDuration."; | 
| +constexpr char kNumTasksBeforeDetachHistogramPrefix[] = | 
| +    "TaskScheduler.NumTasksBeforeDetach."; | 
| constexpr char kNumTasksBetweenWaitsHistogramPrefix[] = | 
| "TaskScheduler.NumTasksBetweenWaits."; | 
| constexpr char kTaskLatencyHistogramPrefix[] = "TaskScheduler.TaskLatency."; | 
| @@ -280,6 +282,10 @@ class SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl | 
| // TaskScheduler.NumTasksBetweenWaits histogram was recorded. | 
| size_t num_tasks_since_last_wait_ = 0; | 
|  | 
| +  // Number of tasks executed since the last time the | 
| +  // TaskScheduler.NumTasksBeforeDetach histogram was recorded. | 
| +  size_t num_tasks_since_last_detach_ = 0; | 
| + | 
| subtle::Atomic32 num_single_threaded_runners_ = 0; | 
|  | 
| const int index_; | 
| @@ -486,8 +492,12 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::OnMainEntry( | 
|  | 
| DCHECK_EQ(num_tasks_since_last_wait_, 0U); | 
|  | 
| +  // Record histograms if the worker detached in the past. | 
| if (!detach_duration.is_max()) { | 
| outer_->detach_duration_histogram_->AddTime(detach_duration); | 
| +    outer_->num_tasks_before_detach_histogram_->Add( | 
| +        num_tasks_since_last_detach_); | 
| +    num_tasks_since_last_detach_ = 0; | 
| did_detach_since_last_get_work_ = true; | 
| } | 
|  | 
| @@ -593,6 +603,7 @@ void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: | 
| DidRunTaskWithPriority(TaskPriority task_priority, | 
| const TimeDelta& task_latency) { | 
| ++num_tasks_since_last_wait_; | 
| +  ++num_tasks_since_last_detach_; | 
|  | 
| const int priority_index = static_cast<int>(task_priority); | 
|  | 
| @@ -673,6 +684,16 @@ SchedulerWorkerPoolImpl::SchedulerWorkerPoolImpl( | 
| TimeDelta::FromHours(1), | 
| 50, | 
| HistogramBase::kUmaTargetedHistogramFlag)), | 
| +      // Mimics the UMA_HISTOGRAM_COUNTS_1000 macro. A SchedulerWorker is | 
| +      // expected to run between zero and a few hundreds of tasks before | 
| +      // detaching. When it runs more than 1000 tasks, there is no need to know | 
| +      // the exact number of tasks that ran. | 
| +      num_tasks_before_detach_histogram_(Histogram::FactoryGet( | 
| +          kNumTasksBeforeDetachHistogramPrefix + name_ + kPoolNameSuffix, | 
| +          1, | 
| +          1000, | 
| +          50, | 
| +          HistogramBase::kUmaTargetedHistogramFlag)), | 
| // Mimics the UMA_HISTOGRAM_COUNTS_100 macro. A SchedulerWorker is | 
| // expected to run between zero and a few tens of tasks between waits. | 
| // When it runs more than 100 tasks, there is no need to know the exact | 
|  |