diff options
Diffstat (limited to 'src/tool_util.c')
-rw-r--r-- | src/tool_util.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/src/tool_util.c b/src/tool_util.c index 04d73e4e3..ec99bf3f6 100644 --- a/src/tool_util.c +++ b/src/tool_util.c @@ -27,27 +27,35 @@ #if defined(WIN32) && !defined(MSDOS) +/* set in win32_init() */ +extern LARGE_INTEGER Curl_freq; +extern bool Curl_isVistaOrGreater; + +/* In case of bug fix this function has a counterpart in timeval.c */ struct timeval tvnow(void) { - /* - ** GetTickCount() is available on _all_ Windows versions from W95 up - ** to nowadays. Returns milliseconds elapsed since last system boot, - ** increases monotonically and wraps once 49.7 days have elapsed. - ** - ** GetTickCount64() is available on Windows version from Windows Vista - ** and Windows Server 2008 up to nowadays. The resolution of the - ** function is limited to the resolution of the system timer, which - ** is typically in the range of 10 milliseconds to 16 milliseconds. - */ struct timeval now; -#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) && \ - (!defined(__MINGW32__) || defined(__MINGW64_VERSION_MAJOR)) - ULONGLONG milliseconds = GetTickCount64(); -#else - DWORD milliseconds = GetTickCount(); + if(Curl_isVistaOrGreater) { /* QPC timer might have issues pre-Vista */ + LARGE_INTEGER count; + QueryPerformanceCounter(&count); + now.tv_sec = (long)(count.QuadPart / Curl_freq.QuadPart); + now.tv_usec = (long)((count.QuadPart % Curl_freq.QuadPart) * 1000000 / + Curl_freq.QuadPart); + } + else { + /* Disable /analyze warning that GetTickCount64 is preferred */ +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:28159) +#endif + DWORD milliseconds = GetTickCount(); +#if defined(_MSC_VER) +#pragma warning(pop) #endif - now.tv_sec = (long)(milliseconds / 1000); - now.tv_usec = (long)((milliseconds % 1000) * 1000); + + now.tv_sec = (long)(milliseconds / 1000); + now.tv_usec = (long)((milliseconds % 1000) * 1000); + } return now; } |