Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1216)

Side by Side Diff: base/task_scheduler/scheduler_worker_pool_impl.cc

Issue 2600023002: Remove worker pool names from TaskScheduler.TaskLatency.* histograms. (Closed)
Patch Set: CR gab #15 (remove friend) Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "base/task_scheduler/scheduler_worker_pool_impl.h" 5 #include "base/task_scheduler/scheduler_worker_pool_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/atomicops.h" 12 #include "base/atomicops.h"
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/bind_helpers.h" 14 #include "base/bind_helpers.h"
15 #include "base/lazy_instance.h" 15 #include "base/lazy_instance.h"
16 #include "base/memory/ptr_util.h" 16 #include "base/memory/ptr_util.h"
17 #include "base/metrics/histogram.h" 17 #include "base/metrics/histogram.h"
18 #include "base/sequence_token.h" 18 #include "base/sequence_token.h"
19 #include "base/sequenced_task_runner.h" 19 #include "base/sequenced_task_runner.h"
20 #include "base/single_thread_task_runner.h" 20 #include "base/single_thread_task_runner.h"
21 #include "base/strings/stringprintf.h" 21 #include "base/strings/stringprintf.h"
22 #include "base/task_runner.h" 22 #include "base/task_runner.h"
23 #include "base/task_scheduler/delayed_task_manager.h" 23 #include "base/task_scheduler/delayed_task_manager.h"
24 #include "base/task_scheduler/task_tracker.h" 24 #include "base/task_scheduler/task_tracker.h"
25 #include "base/task_scheduler/task_traits.h"
25 #include "base/threading/platform_thread.h" 26 #include "base/threading/platform_thread.h"
26 #include "base/threading/thread_local.h" 27 #include "base/threading/thread_local.h"
27 #include "base/threading/thread_restrictions.h" 28 #include "base/threading/thread_restrictions.h"
28 29
29 namespace base { 30 namespace base {
30 namespace internal { 31 namespace internal {
31 32
32 namespace { 33 namespace {
33 34
34 constexpr char kPoolNameSuffix[] = "Pool"; 35 constexpr char kPoolNameSuffix[] = "Pool";
35 constexpr char kDetachDurationHistogramPrefix[] = 36 constexpr char kDetachDurationHistogramPrefix[] =
36 "TaskScheduler.DetachDuration."; 37 "TaskScheduler.DetachDuration.";
37 constexpr char kNumTasksBeforeDetachHistogramPrefix[] = 38 constexpr char kNumTasksBeforeDetachHistogramPrefix[] =
38 "TaskScheduler.NumTasksBeforeDetach."; 39 "TaskScheduler.NumTasksBeforeDetach.";
39 constexpr char kNumTasksBetweenWaitsHistogramPrefix[] = 40 constexpr char kNumTasksBetweenWaitsHistogramPrefix[] =
40 "TaskScheduler.NumTasksBetweenWaits."; 41 "TaskScheduler.NumTasksBetweenWaits.";
41 constexpr char kTaskLatencyHistogramPrefix[] = "TaskScheduler.TaskLatency.";
42 42
43 // SchedulerWorkerPool that owns the current thread, if any. 43 // SchedulerWorkerPool that owns the current thread, if any.
44 LazyInstance<ThreadLocalPointer<const SchedulerWorkerPool>>::Leaky 44 LazyInstance<ThreadLocalPointer<const SchedulerWorkerPool>>::Leaky
45 tls_current_worker_pool = LAZY_INSTANCE_INITIALIZER; 45 tls_current_worker_pool = LAZY_INSTANCE_INITIALIZER;
46 46
47 // A task runner that runs tasks with the PARALLEL ExecutionMode. 47 // A task runner that runs tasks with the PARALLEL ExecutionMode.
48 class SchedulerParallelTaskRunner : public TaskRunner { 48 class SchedulerParallelTaskRunner : public TaskRunner {
49 public: 49 public:
50 // Constructs a SchedulerParallelTaskRunner which can be used to post tasks so 50 // Constructs a SchedulerParallelTaskRunner which can be used to post tasks so
51 // long as |worker_pool| is alive. 51 // long as |worker_pool| is alive.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 121
122 // Sequence for all Tasks posted through this TaskRunner. 122 // Sequence for all Tasks posted through this TaskRunner.
123 const scoped_refptr<Sequence> sequence_ = new Sequence; 123 const scoped_refptr<Sequence> sequence_ = new Sequence;
124 124
125 const TaskTraits traits_; 125 const TaskTraits traits_;
126 SchedulerWorkerPool* const worker_pool_; 126 SchedulerWorkerPool* const worker_pool_;
127 127
128 DISALLOW_COPY_AND_ASSIGN(SchedulerSequencedTaskRunner); 128 DISALLOW_COPY_AND_ASSIGN(SchedulerSequencedTaskRunner);
129 }; 129 };
130 130
131 HistogramBase* GetTaskLatencyHistogram(const std::string& pool_name,
132 TaskPriority task_priority) {
133 const char* task_priority_suffix = nullptr;
134 switch (task_priority) {
135 case TaskPriority::BACKGROUND:
136 task_priority_suffix = ".BackgroundTaskPriority";
137 break;
138 case TaskPriority::USER_VISIBLE:
139 task_priority_suffix = ".UserVisibleTaskPriority";
140 break;
141 case TaskPriority::USER_BLOCKING:
142 task_priority_suffix = ".UserBlockingTaskPriority";
143 break;
144 }
145
146 // Mimics the UMA_HISTOGRAM_TIMES macro.
147 return Histogram::FactoryTimeGet(kTaskLatencyHistogramPrefix + pool_name +
148 kPoolNameSuffix + task_priority_suffix,
149 TimeDelta::FromMilliseconds(1),
150 TimeDelta::FromSeconds(10), 50,
151 HistogramBase::kUmaTargetedHistogramFlag);
152 }
153
154 // Only used in DCHECKs. 131 // Only used in DCHECKs.
155 bool ContainsWorker( 132 bool ContainsWorker(
156 const std::vector<std::unique_ptr<SchedulerWorker>>& workers, 133 const std::vector<std::unique_ptr<SchedulerWorker>>& workers,
157 const SchedulerWorker* worker) { 134 const SchedulerWorker* worker) {
158 auto it = std::find_if(workers.begin(), workers.end(), 135 auto it = std::find_if(workers.begin(), workers.end(),
159 [worker](const std::unique_ptr<SchedulerWorker>& i) { 136 [worker](const std::unique_ptr<SchedulerWorker>& i) {
160 return i.get() == worker; 137 return i.get() == worker;
161 }); 138 });
162 return it != workers.end(); 139 return it != workers.end();
163 } 140 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 int index); 208 int index);
232 ~SchedulerWorkerDelegateImpl() override; 209 ~SchedulerWorkerDelegateImpl() override;
233 210
234 PriorityQueue* single_threaded_priority_queue() { 211 PriorityQueue* single_threaded_priority_queue() {
235 return &single_threaded_priority_queue_; 212 return &single_threaded_priority_queue_;
236 } 213 }
237 214
238 // SchedulerWorker::Delegate: 215 // SchedulerWorker::Delegate:
239 void OnMainEntry(SchedulerWorker* worker) override; 216 void OnMainEntry(SchedulerWorker* worker) override;
240 scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override; 217 scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override;
241 void DidRunTaskWithPriority(TaskPriority task_priority, 218 void DidRunTask() override;
242 TimeDelta task_latency) override;
243 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override; 219 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override;
244 TimeDelta GetSleepTimeout() override; 220 TimeDelta GetSleepTimeout() override;
245 bool CanDetach(SchedulerWorker* worker) override; 221 bool CanDetach(SchedulerWorker* worker) override;
246 void OnDetach() override; 222 void OnDetach() override;
247 223
248 void RegisterSingleThreadTaskRunner() { 224 void RegisterSingleThreadTaskRunner() {
249 // No barrier as barriers only affect sequential consistency which is 225 // No barrier as barriers only affect sequential consistency which is
250 // irrelevant in a single variable use case (they don't force an immediate 226 // irrelevant in a single variable use case (they don't force an immediate
251 // flush anymore than atomics do by default). 227 // flush anymore than atomics do by default).
252 subtle::NoBarrier_AtomicIncrement(&num_single_threaded_runners_, 1); 228 subtle::NoBarrier_AtomicIncrement(&num_single_threaded_runners_, 1);
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 DCHECK(sequence); 568 DCHECK(sequence);
593 569
594 outer_->RemoveFromIdleWorkersStack(worker); 570 outer_->RemoveFromIdleWorkersStack(worker);
595 idle_start_time_ = TimeTicks(); 571 idle_start_time_ = TimeTicks();
596 did_detach_since_last_get_work_ = false; 572 did_detach_since_last_get_work_ = false;
597 last_get_work_returned_nullptr_ = false; 573 last_get_work_returned_nullptr_ = false;
598 574
599 return sequence; 575 return sequence;
600 } 576 }
601 577
602 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: 578 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::DidRunTask() {
603 DidRunTaskWithPriority(TaskPriority task_priority, TimeDelta task_latency) {
604 ++num_tasks_since_last_wait_; 579 ++num_tasks_since_last_wait_;
605 ++num_tasks_since_last_detach_; 580 ++num_tasks_since_last_detach_;
606
607 const int priority_index = static_cast<int>(task_priority);
608
609 // As explained in the header file, histograms are allocated on demand. It
610 // doesn't matter if an element of |task_latency_histograms_| is set multiple
611 // times since GetTaskLatencyHistogram() is idempotent. As explained in the
612 // comment at the top of histogram_macros.h, barriers are required.
613 HistogramBase* task_latency_histogram = reinterpret_cast<HistogramBase*>(
614 subtle::Acquire_Load(&outer_->task_latency_histograms_[priority_index]));
615 if (!task_latency_histogram) {
616 task_latency_histogram =
617 GetTaskLatencyHistogram(outer_->name_, task_priority);
618 subtle::Release_Store(
619 &outer_->task_latency_histograms_[priority_index],
620 reinterpret_cast<subtle::AtomicWord>(task_latency_histogram));
621 }
622
623 task_latency_histogram->AddTime(task_latency);
624 } 581 }
625 582
626 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl:: 583 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::
627 ReEnqueueSequence(scoped_refptr<Sequence> sequence) { 584 ReEnqueueSequence(scoped_refptr<Sequence> sequence) {
628 if (last_sequence_is_single_threaded_) { 585 if (last_sequence_is_single_threaded_) {
629 // A single-threaded Sequence is always re-enqueued in the single-threaded 586 // A single-threaded Sequence is always re-enqueued in the single-threaded
630 // PriorityQueue from which it was extracted. 587 // PriorityQueue from which it was extracted.
631 const SequenceSortKey sequence_sort_key = sequence->GetSortKey(); 588 const SequenceSortKey sequence_sort_key = sequence->GetSortKey();
632 single_threaded_priority_queue_.BeginTransaction()->Push( 589 single_threaded_priority_queue_.BeginTransaction()->Push(
633 std::move(sequence), sequence_sort_key); 590 std::move(sequence), sequence_sort_key);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); 754 AutoSchedulerLock auto_lock(idle_workers_stack_lock_);
798 idle_workers_stack_.Remove(worker); 755 idle_workers_stack_.Remove(worker);
799 } 756 }
800 757
801 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() { 758 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() {
802 return !worker_detachment_disallowed_.IsSet(); 759 return !worker_detachment_disallowed_.IsSet();
803 } 760 }
804 761
805 } // namespace internal 762 } // namespace internal
806 } // namespace base 763 } // namespace base
OLDNEW
« no previous file with comments | « base/task_scheduler/scheduler_worker_pool_impl.h ('k') | base/task_scheduler/scheduler_worker_stack_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698