1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file.
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/debug/lap_timer.h"
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/logging.h"
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace cc {
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)base::TimeTicks Now() {
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return base::TimeTicks::IsThreadNowSupported()
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             ? base::TimeTicks::ThreadNow()
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             : base::TimeTicks::HighResNow();
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)LapTimer::LapTimer(int warmup_laps,
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                   base::TimeDelta time_limit,
23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                   int check_interval)
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    : warmup_laps_(warmup_laps),
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      remaining_warmups_(0),
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      remaining_no_check_laps_(0),
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      time_limit_(time_limit),
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      check_interval_(check_interval) {
29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK_GT(check_interval, 0);
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Reset();
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void LapTimer::Reset() {
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  accumulator_ = base::TimeDelta();
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  num_laps_ = 0;
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  remaining_warmups_ = warmup_laps_;
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  remaining_no_check_laps_ = check_interval_;
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Start();
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void LapTimer::Start() {
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  start_time_ = Now();
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool LapTimer::IsWarmedUp() { return remaining_warmups_ <= 0; }
46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void LapTimer::NextLap() {
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!IsWarmedUp()) {
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    --remaining_warmups_;
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (IsWarmedUp()) {
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      Start();
52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return;
54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ++num_laps_;
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  --remaining_no_check_laps_;
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!remaining_no_check_laps_) {
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::TimeTicks now = Now();
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    accumulator_ += now - start_time_;
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    start_time_ = now;
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    remaining_no_check_laps_ = check_interval_;
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool LapTimer::HasTimeLimitExpired() { return accumulator_ >= time_limit_; }
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool LapTimer::HasTimedAllLaps() { return !(num_laps_ % check_interval_); }
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)float LapTimer::MsPerLap() {
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(HasTimedAllLaps());
71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return accumulator_.InMillisecondsF() / num_laps_;
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)float LapTimer::LapsPerSecond() {
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(HasTimedAllLaps());
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return num_laps_ / accumulator_.InSecondsF();
77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int LapTimer::NumLaps() { return num_laps_; }
80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace cc
82