Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "absl/base/internal/cycleclock.h"
00024
00025 #include <atomic>
00026 #include <chrono>
00027
00028 #include "absl/base/internal/unscaledcycleclock.h"
00029
00030 namespace absl {
00031 namespace base_internal {
00032
00033 #if ABSL_USE_UNSCALED_CYCLECLOCK
00034
00035 namespace {
00036
00037 #ifdef NDEBUG
00038 #ifdef ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY
00039
00040
00041
00042 static constexpr int32_t kShift = 1;
00043 #else
00044
00045
00046
00047 static constexpr int32_t kShift = 0;
00048 #endif
00049 #else
00050
00051
00052 static constexpr int32_t kShift = 2;
00053 #endif
00054
00055 static constexpr double kFrequencyScale = 1.0 / (1 << kShift);
00056 static std::atomic<CycleClockSourceFunc> cycle_clock_source;
00057
00058 CycleClockSourceFunc LoadCycleClockSource() {
00059
00060
00061 if (cycle_clock_source.load(std::memory_order_relaxed) == nullptr) {
00062 return nullptr;
00063 }
00064
00065
00066
00067
00068 return cycle_clock_source.load(std::memory_order_acquire);
00069 }
00070
00071 }
00072
00073 int64_t CycleClock::Now() {
00074 auto fn = LoadCycleClockSource();
00075 if (fn == nullptr) {
00076 return base_internal::UnscaledCycleClock::Now() >> kShift;
00077 }
00078 return fn() >> kShift;
00079 }
00080
00081 double CycleClock::Frequency() {
00082 return kFrequencyScale * base_internal::UnscaledCycleClock::Frequency();
00083 }
00084
00085 void CycleClockSource::Register(CycleClockSourceFunc source) {
00086
00087 cycle_clock_source.store(source, std::memory_order_release);
00088 }
00089
00090 #else
00091
00092 int64_t CycleClock::Now() {
00093 return std::chrono::duration_cast<std::chrono::nanoseconds>(
00094 std::chrono::steady_clock::now().time_since_epoch())
00095 .count();
00096 }
00097
00098 double CycleClock::Frequency() {
00099 return 1e9;
00100 }
00101
00102 #endif
00103
00104 }
00105 }