1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "metrics/timer.h"
18 
19 #include <string>
20 
21 #include "metrics/metrics_library.h"
22 
23 namespace chromeos_metrics {
24 
GetCurrentTime() const25 base::TimeTicks ClockWrapper::GetCurrentTime() const {
26   return base::TimeTicks::Now();
27 }
28 
Timer()29 Timer::Timer()
30     : timer_state_(kTimerStopped),
31       clock_wrapper_(new ClockWrapper()) {}
32 
Start()33 bool Timer::Start() {
34   elapsed_time_ = base::TimeDelta();  // Sets elapsed_time_ to zero.
35   start_time_ = clock_wrapper_->GetCurrentTime();
36   timer_state_ = kTimerRunning;
37   return true;
38 }
39 
Stop()40 bool Timer::Stop() {
41   if (timer_state_ == kTimerStopped)
42     return false;
43   if (timer_state_ == kTimerRunning)
44     elapsed_time_ += clock_wrapper_->GetCurrentTime() - start_time_;
45   timer_state_ = kTimerStopped;
46   return true;
47 }
48 
Pause()49 bool Timer::Pause() {
50   switch (timer_state_) {
51     case kTimerStopped:
52       if (!Start())
53         return false;
54       timer_state_ = kTimerPaused;
55       return true;
56     case kTimerRunning:
57       timer_state_ = kTimerPaused;
58       elapsed_time_ += clock_wrapper_->GetCurrentTime() - start_time_;
59       return true;
60     default:
61       return false;
62   }
63 }
64 
Resume()65 bool Timer::Resume() {
66   switch (timer_state_) {
67     case kTimerStopped:
68       return Start();
69     case kTimerPaused:
70       start_time_ = clock_wrapper_->GetCurrentTime();
71       timer_state_ = kTimerRunning;
72       return true;
73     default:
74       return false;
75   }
76 }
77 
Reset()78 bool Timer::Reset() {
79   elapsed_time_ = base::TimeDelta();  // Sets elapsed_time_ to zero.
80   timer_state_ = kTimerStopped;
81   return true;
82 }
83 
HasStarted() const84 bool Timer::HasStarted() const {
85   return timer_state_ != kTimerStopped;
86 }
87 
GetElapsedTime(base::TimeDelta * elapsed_time) const88 bool Timer::GetElapsedTime(base::TimeDelta* elapsed_time) const {
89   if (start_time_.is_null() || !elapsed_time)
90     return false;
91   *elapsed_time = elapsed_time_;
92   if (timer_state_ == kTimerRunning) {
93     *elapsed_time += clock_wrapper_->GetCurrentTime() - start_time_;
94   }
95   return true;
96 }
97 
98 // static
99 MetricsLibraryInterface* TimerReporter::metrics_lib_ = nullptr;
100 
TimerReporter(const std::string & histogram_name,int min,int max,int num_buckets)101 TimerReporter::TimerReporter(const std::string& histogram_name, int min,
102                              int max, int num_buckets)
103     : histogram_name_(histogram_name),
104       min_(min),
105       max_(max),
106       num_buckets_(num_buckets) {}
107 
ReportMilliseconds() const108 bool TimerReporter::ReportMilliseconds() const {
109   base::TimeDelta elapsed_time;
110   if (!metrics_lib_ || !GetElapsedTime(&elapsed_time)) return false;
111   return metrics_lib_->SendToUMA(histogram_name_,
112                                  elapsed_time.InMilliseconds(),
113                                  min_,
114                                  max_,
115                                  num_buckets_);
116 }
117 
118 }  // namespace chromeos_metrics
119