summaryrefslogtreecommitdiff
path: root/src/classlibnative
diff options
context:
space:
mode:
authorStephen Toub <stoub@microsoft.com>2017-02-23 19:43:58 -0500
committerJan Kotas <jkotas@microsoft.com>2017-02-23 16:43:58 -0800
commit5ec5c2f859f8ff1dc99a2bb95b640b82d2937cc8 (patch)
tree93b439047f8cb06469a7508af2672e759869e0d7 /src/classlibnative
parent6e494d0068d17b3692c88ab4247ca3c607a9b618 (diff)
downloadcoreclr-5ec5c2f859f8ff1dc99a2bb95b640b82d2937cc8.tar.gz
coreclr-5ec5c2f859f8ff1dc99a2bb95b640b82d2937cc8.tar.bz2
coreclr-5ec5c2f859f8ff1dc99a2bb95b640b82d2937cc8.zip
Use GetSystemTimePreciseAsFileTime if available in DateTime.UtcNow (#9736)
Diffstat (limited to 'src/classlibnative')
-rw-r--r--src/classlibnative/bcltype/system.cpp27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/classlibnative/bcltype/system.cpp b/src/classlibnative/bcltype/system.cpp
index 78775f2371..2767d1e749 100644
--- a/src/classlibnative/bcltype/system.cpp
+++ b/src/classlibnative/bcltype/system.cpp
@@ -41,14 +41,37 @@ typedef BOOL (*pfnGetPhoneVersion)(LPOSVERSIONINFO lpVersionInformation);
pfnGetPhoneVersion g_pfnGetPhoneVersion = NULL;
#endif
+typedef void(WINAPI *pfnGetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime);
+extern pfnGetSystemTimeAsFileTime g_pfnGetSystemTimeAsFileTime;
+
+void WINAPI InitializeGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
+{
+ pfnGetSystemTimeAsFileTime func = NULL;
+
+#ifndef FEATURE_PAL
+ HMODULE hKernel32 = WszLoadLibrary(W("kernel32.dll"));
+ if (hKernel32 != NULL)
+ {
+ func = (pfnGetSystemTimeAsFileTime)GetProcAddress(hKernel32, "GetSystemTimePreciseAsFileTime");
+ }
+ if (func == NULL)
+#endif
+ {
+ func = &::GetSystemTimeAsFileTime;
+ }
+
+ g_pfnGetSystemTimeAsFileTime = func;
+ func(lpSystemTimeAsFileTime);
+}
+
+pfnGetSystemTimeAsFileTime g_pfnGetSystemTimeAsFileTime = &InitializeGetSystemTimeAsFileTime;
FCIMPL0(INT64, SystemNative::__GetSystemTimeAsFileTime)
{
FCALL_CONTRACT;
INT64 timestamp;
-
- ::GetSystemTimeAsFileTime((FILETIME*)&timestamp);
+ g_pfnGetSystemTimeAsFileTime((FILETIME*)&timestamp);
#if BIGENDIAN
timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32));