// Copyright 2019 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 BASE_TRACE_EVENT_THREAD_INSTRUCTION_COUNT_H_
#define BASE_TRACE_EVENT_THREAD_INSTRUCTION_COUNT_H_

#include <stdint.h>

namespace base {
namespace trace_event {

// Represents the number of instructions that were retired between two samples
// of a thread's performance counters.
class ThreadInstructionDelta {
 public:
  constexpr ThreadInstructionDelta() : delta_(0) {}
  explicit constexpr ThreadInstructionDelta(int64_t delta) : delta_(delta) {}

  constexpr int64_t ToInternalValue() const { return delta_; }

 private:
  int64_t delta_;
};

// Uses the system's performance counters in order to measure the number of
// instructions that have been retired on the current thread.
class ThreadInstructionCount {
 public:
  // Returns true if the platform supports hardware retired instruction
  // counters.
  static bool IsSupported();

  // Returns the number of retired instructions relative to some epoch count,
  // or -1 if getting the current instruction count failed / is disabled.
  static ThreadInstructionCount Now();

  constexpr ThreadInstructionCount() : value_(-1) {}
  explicit constexpr ThreadInstructionCount(int64_t value) : value_(value) {}

  constexpr bool is_null() const { return value_ == -1; }

  constexpr ThreadInstructionDelta operator-(
      ThreadInstructionCount other) const {
    return ThreadInstructionDelta(value_ - other.value_);
  }

  constexpr int64_t ToInternalValue() const { return value_; }

 private:
  int64_t value_;
};

}  // namespace trace_event
}  // namespace base

#endif  // BASE_TRACE_EVENT_THREAD_INSTRUCTION_COUNT_H_
