42 #ifndef ABSL_BASE_INTERNAL_CYCLECLOCK_H_
43 #define ABSL_BASE_INTERNAL_CYCLECLOCK_H_
48 #include "absl/base/attributes.h"
49 #include "absl/base/config.h"
50 #include "absl/base/internal/unscaledcycleclock.h"
54 namespace base_internal {
76 #if ABSL_USE_UNSCALED_CYCLECLOCK
80 #ifdef ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY
84 static constexpr
int32_t kShift = 1;
89 static constexpr
int32_t kShift = 0;
94 static constexpr
int32_t kShift = 2;
97 static constexpr
double kFrequencyScale = 1.0 / (1 << kShift);
98 ABSL_CONST_INIT static std::atomic<CycleClockSourceFunc> cycle_clock_source_;
99 #endif // ABSL_USE_UNSCALED_CYCLECLOC
120 #if ABSL_USE_UNSCALED_CYCLECLOCK
123 #if !defined(__x86_64__)
126 if (cycle_clock_source_.load(std::memory_order_relaxed) ==
nullptr) {
129 #endif // !defined(__x86_64__)
135 return cycle_clock_source_.load(std::memory_order_acquire);
141 auto fn = LoadCycleClockSource();
145 return fn() >> kShift;
150 return kFrequencyScale * base_internal::UnscaledCycleClock::Frequency();
153 #endif // ABSL_USE_UNSCALED_CYCLECLOCK
159 #endif // ABSL_BASE_INTERNAL_CYCLECLOCK_H_