1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker 15*9356374aSAndroid Build Coastguard Worker // The implementation of CycleClock::Frequency. 16*9356374aSAndroid Build Coastguard Worker // 17*9356374aSAndroid Build Coastguard Worker // NOTE: only i386 and x86_64 have been well tested. 18*9356374aSAndroid Build Coastguard Worker // PPC, sparc, alpha, and ia64 are based on 19*9356374aSAndroid Build Coastguard Worker // http://peter.kuscsik.com/wordpress/?p=14 20*9356374aSAndroid Build Coastguard Worker // with modifications by m3b. See also 21*9356374aSAndroid Build Coastguard Worker // https://setisvn.ssl.berkeley.edu/svn/lib/fftw-3.0.1/kernel/cycle.h 22*9356374aSAndroid Build Coastguard Worker 23*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/cycleclock.h" 24*9356374aSAndroid Build Coastguard Worker 25*9356374aSAndroid Build Coastguard Worker #include <atomic> 26*9356374aSAndroid Build Coastguard Worker #include <chrono> // NOLINT(build/c++11) 27*9356374aSAndroid Build Coastguard Worker 28*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h" 29*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h" 30*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/unscaledcycleclock.h" 31*9356374aSAndroid Build Coastguard Worker 32*9356374aSAndroid Build Coastguard Worker namespace absl { 33*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN 34*9356374aSAndroid Build Coastguard Worker namespace base_internal { 35*9356374aSAndroid Build Coastguard Worker 36*9356374aSAndroid Build Coastguard Worker #if ABSL_USE_UNSCALED_CYCLECLOCK 37*9356374aSAndroid Build Coastguard Worker 38*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL 39*9356374aSAndroid Build Coastguard Worker constexpr int32_t CycleClock::kShift; 40*9356374aSAndroid Build Coastguard Worker constexpr double CycleClock::kFrequencyScale; 41*9356374aSAndroid Build Coastguard Worker #endif 42*9356374aSAndroid Build Coastguard Worker 43*9356374aSAndroid Build Coastguard Worker ABSL_CONST_INIT std::atomic<CycleClockSourceFunc> 44*9356374aSAndroid Build Coastguard Worker CycleClock::cycle_clock_source_{nullptr}; 45*9356374aSAndroid Build Coastguard Worker Register(CycleClockSourceFunc source)46*9356374aSAndroid Build Coastguard Workervoid CycleClockSource::Register(CycleClockSourceFunc source) { 47*9356374aSAndroid Build Coastguard Worker // Corresponds to the load(std::memory_order_acquire) in LoadCycleClockSource. 48*9356374aSAndroid Build Coastguard Worker CycleClock::cycle_clock_source_.store(source, std::memory_order_release); 49*9356374aSAndroid Build Coastguard Worker } 50*9356374aSAndroid Build Coastguard Worker 51*9356374aSAndroid Build Coastguard Worker #ifdef _WIN32 Now()52*9356374aSAndroid Build Coastguard Workerint64_t CycleClock::Now() { 53*9356374aSAndroid Build Coastguard Worker auto fn = LoadCycleClockSource(); 54*9356374aSAndroid Build Coastguard Worker if (fn == nullptr) { 55*9356374aSAndroid Build Coastguard Worker return base_internal::UnscaledCycleClock::Now() >> kShift; 56*9356374aSAndroid Build Coastguard Worker } 57*9356374aSAndroid Build Coastguard Worker return fn() >> kShift; 58*9356374aSAndroid Build Coastguard Worker } 59*9356374aSAndroid Build Coastguard Worker #endif 60*9356374aSAndroid Build Coastguard Worker 61*9356374aSAndroid Build Coastguard Worker #else 62*9356374aSAndroid Build Coastguard Worker 63*9356374aSAndroid Build Coastguard Worker int64_t CycleClock::Now() { 64*9356374aSAndroid Build Coastguard Worker return std::chrono::duration_cast<std::chrono::nanoseconds>( 65*9356374aSAndroid Build Coastguard Worker std::chrono::steady_clock::now().time_since_epoch()) 66*9356374aSAndroid Build Coastguard Worker .count(); 67*9356374aSAndroid Build Coastguard Worker } 68*9356374aSAndroid Build Coastguard Worker 69*9356374aSAndroid Build Coastguard Worker double CycleClock::Frequency() { 70*9356374aSAndroid Build Coastguard Worker return 1e9; 71*9356374aSAndroid Build Coastguard Worker } 72*9356374aSAndroid Build Coastguard Worker 73*9356374aSAndroid Build Coastguard Worker #endif 74*9356374aSAndroid Build Coastguard Worker 75*9356374aSAndroid Build Coastguard Worker } // namespace base_internal 76*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END 77*9356374aSAndroid Build Coastguard Worker } // namespace absl 78