1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/debug/micro_benchmark_controller_impl.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string>
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/values.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace cc {
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class IsDonePredicate {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef const MicroBenchmarkImpl* argument_type;
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef bool result_type;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  result_type operator()(argument_type benchmark) const {
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return benchmark->IsDone();
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MicroBenchmarkControllerImpl::MicroBenchmarkControllerImpl(
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LayerTreeHostImpl* host)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : host_(host) {
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(host_);
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MicroBenchmarkControllerImpl::~MicroBenchmarkControllerImpl() {}
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MicroBenchmarkControllerImpl::ScheduleRun(
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<MicroBenchmarkImpl> benchmark) {
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  benchmarks_.push_back(benchmark.Pass());
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MicroBenchmarkControllerImpl::DidCompleteCommit() {
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (ScopedPtrVector<MicroBenchmarkImpl>::iterator it = benchmarks_.begin();
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       it != benchmarks_.end();
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       ++it) {
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK(!(*it)->IsDone());
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    (*it)->DidCompleteCommit(host_);
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CleanUpFinishedBenchmarks();
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MicroBenchmarkControllerImpl::CleanUpFinishedBenchmarks() {
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  benchmarks_.erase(
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      benchmarks_.partition(std::not1(IsDonePredicate())),
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      benchmarks_.end());
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace cc
60