unscaledcycleclock_config.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2022 The Abseil Authors
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #ifndef Y_ABSL_BASE_INTERNAL_UNSCALEDCYCLECLOCK_CONFIG_H_
  15. #define Y_ABSL_BASE_INTERNAL_UNSCALEDCYCLECLOCK_CONFIG_H_
  16. #if defined(__APPLE__)
  17. #include <TargetConditionals.h>
  18. #endif
  19. // The following platforms have an implementation of a hardware counter.
  20. #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \
  21. defined(__powerpc__) || defined(__ppc__) || defined(__riscv) || \
  22. defined(_M_IX86) || (defined(_M_X64) && !defined(_M_ARM64EC))
  23. #define Y_ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1
  24. #else
  25. #define Y_ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 0
  26. #endif
  27. // The following platforms often disable access to the hardware
  28. // counter (through a sandbox) even if the underlying hardware has a
  29. // usable counter. The CycleTimer interface also requires a *scaled*
  30. // CycleClock that runs at atleast 1 MHz. We've found some Android
  31. // ARM64 devices where this is not the case, so we disable it by
  32. // default on Android ARM64.
  33. #if defined(__native_client__) || (defined(__APPLE__)) || \
  34. (defined(__ANDROID__) && defined(__aarch64__))
  35. #define Y_ABSL_USE_UNSCALED_CYCLECLOCK_DEFAULT 0
  36. #else
  37. #define Y_ABSL_USE_UNSCALED_CYCLECLOCK_DEFAULT 1
  38. #endif
  39. // UnscaledCycleClock is an optional internal feature.
  40. // Use "#if Y_ABSL_USE_UNSCALED_CYCLECLOCK" to test for its presence.
  41. // Can be overridden at compile-time via -DABSL_USE_UNSCALED_CYCLECLOCK=0|1
  42. #if !defined(Y_ABSL_USE_UNSCALED_CYCLECLOCK)
  43. #define Y_ABSL_USE_UNSCALED_CYCLECLOCK \
  44. (Y_ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION && \
  45. Y_ABSL_USE_UNSCALED_CYCLECLOCK_DEFAULT)
  46. #endif
  47. #if Y_ABSL_USE_UNSCALED_CYCLECLOCK
  48. // This macro can be used to test if UnscaledCycleClock::Frequency()
  49. // is NominalCPUFrequency() on a particular platform.
  50. #if (defined(__i386__) || defined(__x86_64__) || defined(__riscv) || \
  51. defined(_M_IX86) || defined(_M_X64))
  52. #define Y_ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY
  53. #endif
  54. #endif
  55. #endif // Y_ABSL_BASE_INTERNAL_UNSCALEDCYCLECLOCK_CONFIG_H_