Use platform-specific, hopefully higher precision, system time. (#2823)
Fixes https://github.com/google/iree/issues/2801
diff --git a/iree/base/BUILD b/iree/base/BUILD
index b7b42dc..39fa96f 100644
--- a/iree/base/BUILD
+++ b/iree/base/BUILD
@@ -42,6 +42,8 @@
":api_util",
":file_mapping",
":init",
+ ":platform_headers",
+ ":target_platform",
":tracing",
],
)
diff --git a/iree/base/CMakeLists.txt b/iree/base/CMakeLists.txt
index 8bba6da..4b41edc 100644
--- a/iree/base/CMakeLists.txt
+++ b/iree/base/CMakeLists.txt
@@ -37,6 +37,8 @@
::api_util
::file_mapping
::init
+ ::platform_headers
+ ::target_platform
::tracing
PUBLIC
)
diff --git a/iree/base/api.cc b/iree/base/api.cc
index c6e4b04..799673e 100644
--- a/iree/base/api.cc
+++ b/iree/base/api.cc
@@ -14,7 +14,6 @@
#include "iree/base/api.h"
-#include <chrono>
#include <cstdlib>
#include <cstring>
#include <string>
@@ -22,8 +21,14 @@
#include "iree/base/api_util.h"
#include "iree/base/file_mapping.h"
#include "iree/base/init.h"
+#include "iree/base/platform_headers.h"
#include "iree/base/tracing.h"
+#if defined(IREE_PLATFORM_ANDROID) || defined(IREE_PLATFORM_APPLE) || \
+ defined(IREE_PLATFORM_LINUX)
+#include <ctime>
+#endif
+
namespace iree {
//===----------------------------------------------------------------------===//
@@ -96,10 +101,28 @@
//===----------------------------------------------------------------------===//
IREE_API_EXPORT iree_time_t iree_time_now() {
- auto now = std::chrono::system_clock::now();
- auto now_nanos = std::chrono::time_point_cast<std::chrono::nanoseconds>(now);
- auto now_nanos_since_epoch = now_nanos.time_since_epoch();
- return now_nanos_since_epoch.count();
+#if defined(IREE_PLATFORM_WINDOWS)
+ // GetSystemTimePreciseAsFileTime requires Windows 8, add a fallback
+ // (such as using std::chrono) if older support is needed.
+ FILETIME system_time;
+ ::GetSystemTimePreciseAsFileTime(&system_time);
+
+ constexpr int64_t kUnixEpochStartTicks = 116444736000000000i64;
+ constexpr int64_t kFtToMicroSec = 10;
+ LARGE_INTEGER li;
+ li.LowPart = system_time.dwLowDateTime;
+ li.HighPart = system_time.dwHighDateTime;
+ li.QuadPart -= kUnixEpochStartTicks;
+ li.QuadPart /= kFtToMicroSec;
+ return li.QuadPart;
+#elif defined(IREE_PLATFORM_ANDROID) || defined(IREE_PLATFORM_APPLE) || \
+ defined(IREE_PLATFORM_LINUX)
+ timespec clock_time;
+ clock_gettime(CLOCK_REALTIME, &clock_time);
+ return clock_time.tv_nsec;
+#else
+#error "IREE system clock needs to be set up for your platform"
+#endif
}
IREE_API_EXPORT iree_time_t