Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit a851bd8

Browse files
committed
Use GetSystemTimePreciseAsFileTime if available in DateTime.UtcNow
1 parent d2f8561 commit a851bd8

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

src/classlibnative/bcltype/system.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,35 @@ typedef BOOL (*pfnGetPhoneVersion)(LPOSVERSIONINFO lpVersionInformation);
4141
pfnGetPhoneVersion g_pfnGetPhoneVersion = NULL;
4242
#endif
4343

44+
typedef void(WINAPI *pfnGetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime);
45+
pfnGetSystemTimeAsFileTime g_pfnGetSystemTimeAsFileTime = NULL;
46+
Volatile<bool> g_fGetSystemTimeAsFileTimeInitialized = false;
4447

4548
FCIMPL0(INT64, SystemNative::__GetSystemTimeAsFileTime)
4649
{
4750
FCALL_CONTRACT;
4851

49-
INT64 timestamp;
52+
if (!g_fGetSystemTimeAsFileTimeInitialized)
53+
{
54+
// Try to use GetSystemTimePreciseAsFileTime if it's available (Win8+).
55+
// Otherwise fall back to GetSystemTimeAsFileTime.
56+
pfnGetSystemTimeAsFileTime func = NULL;
57+
HMODULE hKernel32 = WszLoadLibrary(W("kernel32.dll"));
58+
if (hKernel32 != NULL)
59+
{
60+
func = (pfnGetSystemTimeAsFileTime)GetProcAddress(hKernel32, "GetSystemTimePreciseAsFileTime");
61+
}
62+
if (func == NULL)
63+
{
64+
func = &::GetSystemTimeAsFileTime;
65+
}
66+
67+
g_pfnGetSystemTimeAsFileTime = func;
68+
g_fGetSystemTimeAsFileTimeInitialized = true;
69+
}
5070

51-
::GetSystemTimeAsFileTime((FILETIME*)&timestamp);
71+
INT64 timestamp;
72+
g_pfnGetSystemTimeAsFileTime((FILETIME*)&timestamp);
5273

5374
#if BIGENDIAN
5475
timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32));

0 commit comments

Comments
 (0)