OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "cc/debug/micro_benchmark_controller.h" | 5 #include "cc/debug/micro_benchmark_controller.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 return make_scoped_ptr(new InvalidationBenchmark(value.Pass(), callback)); | 30 return make_scoped_ptr(new InvalidationBenchmark(value.Pass(), callback)); |
31 } else if (name == "rasterize_and_record_benchmark") { | 31 } else if (name == "rasterize_and_record_benchmark") { |
32 return make_scoped_ptr( | 32 return make_scoped_ptr( |
33 new RasterizeAndRecordBenchmark(value.Pass(), callback)); | 33 new RasterizeAndRecordBenchmark(value.Pass(), callback)); |
34 } else if (name == "unittest_only_benchmark") { | 34 } else if (name == "unittest_only_benchmark") { |
35 return make_scoped_ptr(new UnittestOnlyBenchmark(value.Pass(), callback)); | 35 return make_scoped_ptr(new UnittestOnlyBenchmark(value.Pass(), callback)); |
36 } | 36 } |
37 return nullptr; | 37 return nullptr; |
38 } | 38 } |
39 | 39 |
40 class IsDonePredicate { | |
41 public: | |
42 typedef const MicroBenchmark* argument_type; | |
43 typedef bool result_type; | |
44 | |
45 result_type operator()(argument_type benchmark) const { | |
46 return benchmark->IsDone(); | |
47 } | |
48 }; | |
49 | |
50 } // namespace | 40 } // namespace |
51 | 41 |
52 MicroBenchmarkController::MicroBenchmarkController(LayerTreeHost* host) | 42 MicroBenchmarkController::MicroBenchmarkController(LayerTreeHost* host) |
53 : host_(host), | 43 : host_(host), |
54 main_controller_task_runner_(base::ThreadTaskRunnerHandle::IsSet() | 44 main_controller_task_runner_(base::ThreadTaskRunnerHandle::IsSet() |
55 ? base::ThreadTaskRunnerHandle::Get() | 45 ? base::ThreadTaskRunnerHandle::Get() |
56 : nullptr) { | 46 : nullptr) { |
57 DCHECK(host_); | 47 DCHECK(host_); |
58 } | 48 } |
59 | 49 |
(...skipping 18 matching lines...) Expand all Loading... |
78 int MicroBenchmarkController::GetNextIdAndIncrement() { | 68 int MicroBenchmarkController::GetNextIdAndIncrement() { |
79 int id = next_id_++; | 69 int id = next_id_++; |
80 // Wrap around to 1 if we overflow (very unlikely). | 70 // Wrap around to 1 if we overflow (very unlikely). |
81 if (next_id_ == std::numeric_limits<int>::max()) | 71 if (next_id_ == std::numeric_limits<int>::max()) |
82 next_id_ = 1; | 72 next_id_ = 1; |
83 return id; | 73 return id; |
84 } | 74 } |
85 | 75 |
86 bool MicroBenchmarkController::SendMessage(int id, | 76 bool MicroBenchmarkController::SendMessage(int id, |
87 scoped_ptr<base::Value> value) { | 77 scoped_ptr<base::Value> value) { |
88 for (ScopedPtrVector<MicroBenchmark>::iterator it = benchmarks_.begin(); | 78 auto it = std::find_if(benchmarks_.begin(), benchmarks_.end(), |
89 it != benchmarks_.end(); | 79 [id](const scoped_ptr<MicroBenchmark>& benchmark) { |
90 ++it) { | 80 return benchmark->id() == id; |
91 if ((*it)->id() == id) | 81 }); |
92 return (*it)->ProcessMessage(value.Pass()); | 82 if (it == benchmarks_.end()) |
93 } | 83 return false; |
94 return false; | 84 return (*it)->ProcessMessage(std::move(value)); |
95 } | 85 } |
96 | 86 |
97 void MicroBenchmarkController::ScheduleImplBenchmarks( | 87 void MicroBenchmarkController::ScheduleImplBenchmarks( |
98 LayerTreeHostImpl* host_impl) { | 88 LayerTreeHostImpl* host_impl) { |
99 for (ScopedPtrVector<MicroBenchmark>::iterator it = benchmarks_.begin(); | 89 for (const auto& benchmark : benchmarks_) { |
100 it != benchmarks_.end(); | |
101 ++it) { | |
102 scoped_ptr<MicroBenchmarkImpl> benchmark_impl; | 90 scoped_ptr<MicroBenchmarkImpl> benchmark_impl; |
103 if (!(*it)->ProcessedForBenchmarkImpl()) { | 91 if (!benchmark->ProcessedForBenchmarkImpl()) { |
104 benchmark_impl = (*it)->GetBenchmarkImpl(main_controller_task_runner_); | 92 benchmark_impl = |
| 93 benchmark->GetBenchmarkImpl(main_controller_task_runner_); |
105 } | 94 } |
106 | 95 |
107 if (benchmark_impl.get()) | 96 if (benchmark_impl.get()) |
108 host_impl->ScheduleMicroBenchmark(benchmark_impl.Pass()); | 97 host_impl->ScheduleMicroBenchmark(benchmark_impl.Pass()); |
109 } | 98 } |
110 } | 99 } |
111 | 100 |
112 void MicroBenchmarkController::DidUpdateLayers() { | 101 void MicroBenchmarkController::DidUpdateLayers() { |
113 for (ScopedPtrVector<MicroBenchmark>::iterator it = benchmarks_.begin(); | 102 for (const auto& benchmark : benchmarks_) { |
114 it != benchmarks_.end(); | 103 if (!benchmark->IsDone()) |
115 ++it) { | 104 benchmark->DidUpdateLayers(host_); |
116 if (!(*it)->IsDone()) | |
117 (*it)->DidUpdateLayers(host_); | |
118 } | 105 } |
119 | 106 |
120 CleanUpFinishedBenchmarks(); | 107 CleanUpFinishedBenchmarks(); |
121 } | 108 } |
122 | 109 |
123 void MicroBenchmarkController::CleanUpFinishedBenchmarks() { | 110 void MicroBenchmarkController::CleanUpFinishedBenchmarks() { |
124 benchmarks_.erase( | 111 benchmarks_.erase( |
125 benchmarks_.partition(std::not1(IsDonePredicate())), | 112 std::remove_if(benchmarks_.begin(), benchmarks_.end(), |
| 113 [](const scoped_ptr<MicroBenchmark>& benchmark) { |
| 114 return benchmark->IsDone(); |
| 115 }), |
126 benchmarks_.end()); | 116 benchmarks_.end()); |
127 } | 117 } |
128 | 118 |
129 } // namespace cc | 119 } // namespace cc |
OLD | NEW |