| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "absl/base/internal/cycleclock.h" |
|
|
| #include <atomic> |
| #include <chrono> |
|
|
| #include "absl/base/attributes.h" |
| #include "absl/base/config.h" |
| #include "absl/base/internal/unscaledcycleclock.h" |
|
|
| namespace absl { |
| ABSL_NAMESPACE_BEGIN |
| namespace base_internal { |
|
|
| #if ABSL_USE_UNSCALED_CYCLECLOCK |
|
|
| #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL |
| constexpr int32_t CycleClock::kShift; |
| constexpr double CycleClock::kFrequencyScale; |
| #endif |
|
|
| ABSL_CONST_INIT std::atomic<CycleClockSourceFunc> |
| CycleClock::cycle_clock_source_{nullptr}; |
|
|
| void CycleClockSource::Register(CycleClockSourceFunc source) { |
| |
| CycleClock::cycle_clock_source_.store(source, std::memory_order_release); |
| } |
|
|
| #ifdef _WIN32 |
| int64_t CycleClock::Now() { |
| auto fn = LoadCycleClockSource(); |
| if (fn == nullptr) { |
| return base_internal::UnscaledCycleClock::Now() >> kShift; |
| } |
| return fn() >> kShift; |
| } |
| #endif |
|
|
| #else |
|
|
| int64_t CycleClock::Now() { |
| return std::chrono::duration_cast<std::chrono::nanoseconds>( |
| std::chrono::steady_clock::now().time_since_epoch()) |
| .count(); |
| } |
|
|
| double CycleClock::Frequency() { |
| return 1e9; |
| } |
|
|
| #endif |
|
|
| } |
| ABSL_NAMESPACE_END |
| } |
|
|