1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77

ash / metrics / task_switch_time_tracker.h [blame]

// Copyright 2015 The Chromium Authors
// 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 <memory>
#include <string>

#include "ash/ash_export.h"
#include "base/memory/raw_ptr.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.
  raw_ptr<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_|.
  raw_ptr<const base::TickClock> tick_clock_;
};

}  // namespace ash

#endif  // ASH_METRICS_TASK_SWITCH_TIME_TRACKER_H_