diff options
author | Stephen Toub <stoub@microsoft.com> | 2017-02-23 19:43:58 -0500 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2017-02-23 16:43:58 -0800 |
commit | 5ec5c2f859f8ff1dc99a2bb95b640b82d2937cc8 (patch) | |
tree | 93b439047f8cb06469a7508af2672e759869e0d7 /src/classlibnative | |
parent | 6e494d0068d17b3692c88ab4247ca3c607a9b618 (diff) | |
download | coreclr-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.cpp | 27 |
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*)×tamp); + g_pfnGetSystemTimeAsFileTime((FILETIME*)×tamp); #if BIGENDIAN timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32)); |