// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_ANDROID_THREAD_INSTRUCTION_COUNT_H_ #define BASE_ANDROID_THREAD_INSTRUCTION_COUNT_H_ #include #include "base/base_export.h" namespace base { namespace android { // Represents the number of instructions that were retired between two samples // of a thread's performance counters. class BASE_EXPORT 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_; }; // Helper class for reading the current count of instructions retired for the // current thread via ThreadInstructionCount::Now(). Does *not* count // instructions retired while running in the kernel. // // Limitations: // * Crashes when used in sandboxed process // * Works on a userdebug build of Android 12, kernel 4.19. May require extra // effort to allow on later Android releases and kernel versions. class BASE_EXPORT ThreadInstructionCount { public: // Returns true if the platform supports hardware retired instruction // counters. May crash in sandboxed processes. static bool IsSupported(); // Returns the number of retired instructions relative to some epoch count, // or 0 if getting the current instruction count failed / is disabled. static ThreadInstructionCount Now(); explicit constexpr ThreadInstructionCount(uint64_t value = 0) : value_(value) {} constexpr ThreadInstructionDelta operator-( ThreadInstructionCount other) const { return ThreadInstructionDelta(static_cast(value_ - other.value_)); } constexpr uint64_t ToInternalValue() const { return value_; } private: uint64_t value_; }; } // namespace android } // namespace base #endif // BASE_ANDROID_THREAD_INSTRUCTION_COUNT_H_