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 <string> | 8 #include <string> |
8 | 9 |
9 #include "base/callback.h" | 10 #include "base/callback.h" |
10 #include "base/message_loop/message_loop_proxy.h" | 11 #include "base/message_loop/message_loop_proxy.h" |
11 #include "base/values.h" | 12 #include "base/values.h" |
12 #include "cc/debug/picture_record_benchmark.h" | 13 #include "cc/debug/picture_record_benchmark.h" |
13 #include "cc/debug/rasterize_and_record_benchmark.h" | 14 #include "cc/debug/rasterize_and_record_benchmark.h" |
14 #include "cc/debug/unittest_only_benchmark.h" | 15 #include "cc/debug/unittest_only_benchmark.h" |
15 #include "cc/trees/layer_tree_host.h" | 16 #include "cc/trees/layer_tree_host.h" |
16 #include "cc/trees/layer_tree_host_impl.h" | 17 #include "cc/trees/layer_tree_host_impl.h" |
17 | 18 |
18 namespace cc { | 19 namespace cc { |
19 | 20 |
| 21 int MicroBenchmarkController::next_id_ = 1; |
| 22 |
20 namespace { | 23 namespace { |
21 | 24 |
22 scoped_ptr<MicroBenchmark> CreateBenchmark( | 25 scoped_ptr<MicroBenchmark> CreateBenchmark( |
23 const std::string& name, | 26 const std::string& name, |
24 scoped_ptr<base::Value> value, | 27 scoped_ptr<base::Value> value, |
25 const MicroBenchmark::DoneCallback& callback) { | 28 const MicroBenchmark::DoneCallback& callback) { |
26 if (name == "picture_record_benchmark") { | 29 if (name == "picture_record_benchmark") { |
27 return scoped_ptr<MicroBenchmark>( | 30 return scoped_ptr<MicroBenchmark>( |
28 new PictureRecordBenchmark(value.Pass(), callback)); | 31 new PictureRecordBenchmark(value.Pass(), callback)); |
29 } else if (name == "rasterize_and_record_benchmark") { | 32 } else if (name == "rasterize_and_record_benchmark") { |
(...skipping 19 matching lines...) Expand all Loading... |
49 } // namespace | 52 } // namespace |
50 | 53 |
51 MicroBenchmarkController::MicroBenchmarkController(LayerTreeHost* host) | 54 MicroBenchmarkController::MicroBenchmarkController(LayerTreeHost* host) |
52 : host_(host), | 55 : host_(host), |
53 main_controller_message_loop_(base::MessageLoopProxy::current().get()) { | 56 main_controller_message_loop_(base::MessageLoopProxy::current().get()) { |
54 DCHECK(host_); | 57 DCHECK(host_); |
55 } | 58 } |
56 | 59 |
57 MicroBenchmarkController::~MicroBenchmarkController() {} | 60 MicroBenchmarkController::~MicroBenchmarkController() {} |
58 | 61 |
59 bool MicroBenchmarkController::ScheduleRun( | 62 int MicroBenchmarkController::ScheduleRun( |
60 const std::string& micro_benchmark_name, | 63 const std::string& micro_benchmark_name, |
61 scoped_ptr<base::Value> value, | 64 scoped_ptr<base::Value> value, |
62 const MicroBenchmark::DoneCallback& callback) { | 65 const MicroBenchmark::DoneCallback& callback) { |
63 scoped_ptr<MicroBenchmark> benchmark = | 66 scoped_ptr<MicroBenchmark> benchmark = |
64 CreateBenchmark(micro_benchmark_name, value.Pass(), callback); | 67 CreateBenchmark(micro_benchmark_name, value.Pass(), callback); |
65 if (benchmark.get()) { | 68 if (benchmark.get()) { |
| 69 int id = GetNextIdAndIncrement(); |
| 70 benchmark->set_id(id); |
66 benchmarks_.push_back(benchmark.Pass()); | 71 benchmarks_.push_back(benchmark.Pass()); |
67 host_->SetNeedsCommit(); | 72 host_->SetNeedsCommit(); |
68 return true; | 73 return id; |
| 74 } |
| 75 return 0; |
| 76 } |
| 77 |
| 78 int MicroBenchmarkController::GetNextIdAndIncrement() { |
| 79 int id = next_id_++; |
| 80 // Wrap around to 1 if we overflow (very unlikely). |
| 81 if (next_id_ == std::numeric_limits<int>::max()) |
| 82 next_id_ = 1; |
| 83 return id; |
| 84 } |
| 85 |
| 86 bool MicroBenchmarkController::SendMessage(int id, |
| 87 scoped_ptr<base::Value> value) { |
| 88 for (ScopedPtrVector<MicroBenchmark>::iterator it = benchmarks_.begin(); |
| 89 it != benchmarks_.end(); |
| 90 ++it) { |
| 91 if ((*it)->id() == id) |
| 92 return (*it)->ProcessMessage(value.Pass()); |
69 } | 93 } |
70 return false; | 94 return false; |
71 } | 95 } |
72 | 96 |
73 void MicroBenchmarkController::ScheduleImplBenchmarks( | 97 void MicroBenchmarkController::ScheduleImplBenchmarks( |
74 LayerTreeHostImpl* host_impl) { | 98 LayerTreeHostImpl* host_impl) { |
75 for (ScopedPtrVector<MicroBenchmark>::iterator it = benchmarks_.begin(); | 99 for (ScopedPtrVector<MicroBenchmark>::iterator it = benchmarks_.begin(); |
76 it != benchmarks_.end(); | 100 it != benchmarks_.end(); |
77 ++it) { | 101 ++it) { |
78 scoped_ptr<MicroBenchmarkImpl> benchmark_impl; | 102 scoped_ptr<MicroBenchmarkImpl> benchmark_impl; |
(...skipping 18 matching lines...) Expand all Loading... |
97 CleanUpFinishedBenchmarks(); | 121 CleanUpFinishedBenchmarks(); |
98 } | 122 } |
99 | 123 |
100 void MicroBenchmarkController::CleanUpFinishedBenchmarks() { | 124 void MicroBenchmarkController::CleanUpFinishedBenchmarks() { |
101 benchmarks_.erase( | 125 benchmarks_.erase( |
102 benchmarks_.partition(std::not1(IsDonePredicate())), | 126 benchmarks_.partition(std::not1(IsDonePredicate())), |
103 benchmarks_.end()); | 127 benchmarks_.end()); |
104 } | 128 } |
105 | 129 |
106 } // namespace cc | 130 } // namespace cc |
OLD | NEW |