blob: fda4d36c9dfea31cf17b3096a2fba1e28331b87b [file] [log] [blame]
// 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_