aboutsummaryrefslogtreecommitdiffhomepage
path: root/absl/time/internal/get_current_time_ios.inc
diff options
context:
space:
mode:
Diffstat (limited to 'absl/time/internal/get_current_time_ios.inc')
-rw-r--r--absl/time/internal/get_current_time_ios.inc80
1 files changed, 80 insertions, 0 deletions
diff --git a/absl/time/internal/get_current_time_ios.inc b/absl/time/internal/get_current_time_ios.inc
new file mode 100644
index 0000000..f3db32b
--- /dev/null
+++ b/absl/time/internal/get_current_time_ios.inc
@@ -0,0 +1,80 @@
+#include "absl/time/clock.h"
+
+#include <sys/time.h>
+#include <ctime>
+#include <cstdint>
+
+#include "absl/base/internal/raw_logging.h"
+
+// These are not defined in the Xcode 7.3.1 SDK Headers.
+// Once we are no longer supporting Xcode 7.3.1 we can
+// remove these.
+#ifndef __WATCHOS_3_0
+#define __WATCHOS_3_0 30000
+#endif
+
+#ifndef __TVOS_10_0
+#define __TVOS_10_0 100000
+#endif
+
+#ifndef __IPHONE_10_0
+#define __IPHONE_10_0 100000
+#endif
+
+#ifndef __MAC_10_12
+#define __MAC_10_12 101200
+#endif
+
+namespace absl {
+namespace time_internal {
+
+static int64_t GetCurrentTimeNanosFromSystem() {
+#if (__MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_10_12) || \
+ (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0) || \
+ (__WATCH_OS_VERSION_MAX_ALLOWED >= __WATCHOS_3_0) || \
+ (__TV_OS_VERSION_MAX_ALLOWED >= __TVOS_10_0)
+ // clock_gettime_nsec_np is not defined on SDKs before Xcode 8.0.
+ // This preprocessor logic is based upon __CLOCK_AVAILABILITY in
+ // usr/include/time.h. Once we are no longer supporting Xcode 7.3.1 we can
+ // remove this #if.
+ // We must continue to check if it is defined until we are sure that ALL the
+ // platforms we are shipping on support it.
+ // clock_gettime_nsec_np is preferred because it may give higher accuracy than
+ // gettimeofday in future Apple operating systems.
+ // Currently (macOS 10.12/iOS 10.2) clock_gettime_nsec_np accuracy is
+ // microsecond accuracy (i.e. equivalent to gettimeofday).
+ if (&clock_gettime_nsec_np != nullptr) {
+ return clock_gettime_nsec_np(CLOCK_REALTIME);
+ }
+#endif
+#if (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \
+ (__MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_12)) || \
+ (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && \
+ (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)) || \
+ (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && \
+ (__WATCH_OS_VERSION_MIN_REQUIRED < __WATCHOS_3_0)) || \
+ (defined(__TV_OS_VERSION_MIN_REQUIRED) && \
+ (__TV_OS_VERSION_MIN_REQUIRED < __TVOS_10_0))
+ // We need this block in 2 different cases:
+ // a) where we are compiling with Xcode 7 in which case the block above
+ // will not be compiled in, and this is the only block executed.
+ // b) where we are compiling with Xcode 8+ but supporting operating systems
+ // that do not define clock_gettime_nsec_np, so this is in effect
+ // an else block to the block above.
+ // This block will not be compiled if the min supported version is
+ // guaranteed to supply clock_gettime_nsec_np.
+ //
+ // Once we know that clock_gettime_nsec_np is in the SDK *AND* exists on
+ // all the platforms we support, we can remove both this block and alter the
+ // block above to just call clock_gettime_nsec_np directly.
+ const int64_t kNanosPerSecond = 1000 * 1000 * 1000;
+ const int64_t kNanosPerMicrosecond = 1000;
+ struct timeval tp;
+ ABSL_RAW_CHECK(gettimeofday(&tp, nullptr) == 0, "Failed gettimeofday");
+ return (int64_t{tp.tv_sec} * kNanosPerSecond +
+ int64_t{tp.tv_usec} * kNanosPerMicrosecond);
+#endif
+}
+
+} // namespace time_internal
+} // namespace absl