// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef ASH_METRICS_TASK_SWITCH_TIME_TRACKER_H_ #define ASH_METRICS_TASK_SWITCH_TIME_TRACKER_H_ #include #include #include "ash/ash_export.h" #include "base/time/time.h" namespace base { class HistogramBase; class TickClock; } namespace ash { // Tracks time deltas between task switches and records them in a histogram. class ASH_EXPORT TaskSwitchTimeTracker { public: // Create a TaskSwitchTimeTracker that will record data to the histogram with // the given |histogram_name|. explicit TaskSwitchTimeTracker(const std::string& histogram_name); TaskSwitchTimeTracker(const TaskSwitchTimeTracker&) = delete; TaskSwitchTimeTracker& operator=(const TaskSwitchTimeTracker&) = delete; ~TaskSwitchTimeTracker(); // Notifies |this| that a task switch has occurred. A histogram data point // will be recorded for all calls but the first. void OnTaskSwitch(); private: friend class TaskSwitchTimeTrackerTestAPI; // Private constructor that the TaskSwitchTimeTrackerTestAPI can use to // inject a custom |tick_clock|. // This doesn't take the ownership of the clock. |tick_clock| must outlive // TaskSwitchTimeTracker. TaskSwitchTimeTracker(const std::string& histogram_name, const base::TickClock* tick_clock); // Returns true if |last_action_time_| has a valid value. bool HasLastActionTime() const; // Sets the |last_action_time_| to |tick_clock_|'s current value and returns // the previous value for |last_action_time_|. base::TimeTicks SetLastActionTime(); // Records a data point in the histogram. void RecordTimeDelta(); // Lazily obtains and sets the |histogram_|. base::HistogramBase* GetHistogram(); // The histogram name to record data to. std::string histogram_name_; // The histogram to log data to. Set via GetHistogram() using lazy load. base::HistogramBase* histogram_ = nullptr; // Tracks the last time OnTaskSwitch() was called. A value of // base::TimeTicks() should be interpreted as not set. base::TimeTicks last_action_time_ = base::TimeTicks(); // The clock used to determine the |last_action_time_|. const base::TickClock* tick_clock_; }; } // namespace ash #endif // ASH_METRICS_TASK_SWITCH_TIME_TRACKER_H_