diff options
author | Daniel Stenberg <daniel@haxx.se> | 2019-02-14 17:08:29 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2019-02-15 23:23:14 +0100 |
commit | ca597ad34a4bf2f4f1c2352186d3e589040a0b54 (patch) | |
tree | e74c2093ac05a48ce63fe069c4633225e141bc4f | |
parent | 208c77713aaab87d77a3b11f83308b7db61aaabc (diff) |
Curl_now: figure out windows version in win32_init
... and avoid use of static variables that aren't thread safe.
Fixes regression from e9ababd4f5a (present in the 7.64.0 release)
Reported-by: Paul Groke
Fixes #3572
Closes #3573
-rw-r--r-- | lib/easy.c | 16 | ||||
-rw-r--r-- | lib/timeval.c | 24 |
2 files changed, 24 insertions, 16 deletions
diff --git a/lib/easy.c b/lib/easy.c index 6fcad3dec..d2d4166d5 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -75,6 +75,7 @@ #include "ssh.h" #include "setopt.h" #include "http_digest.h" +#include "system_win32.h" /* The last 3 #include files should be in this order */ #include "curl_printf.h" @@ -95,6 +96,11 @@ static void win32_cleanup(void) #endif } +#ifdef WIN32 +LARGE_INTEGER Curl_freq; +bool Curl_isVistaOrGreater; +#endif + /* win32_init() performs win32 socket initialization to properly setup the stack to allow networking */ static CURLcode win32_init(void) @@ -144,6 +150,16 @@ static CURLcode win32_init(void) } #endif +#ifdef WIN32 + if(Curl_verify_windows_version(6, 0, PLATFORM_WINNT, + VERSION_GREATER_THAN_EQUAL)) { + Curl_isVistaOrGreater = TRUE; + QueryPerformanceFrequency(&Curl_freq); + } + else + Curl_isVistaOrGreater = FALSE; +#endif + return CURLE_OK; } diff --git a/lib/timeval.c b/lib/timeval.c index 2569f175c..ff8d8a69a 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -21,30 +21,22 @@ ***************************************************************************/ #include "timeval.h" -#include "system_win32.h" #if defined(WIN32) && !defined(MSDOS) +/* set in win32_init() */ +extern LARGE_INTEGER Curl_freq; +extern bool Curl_isVistaOrGreater; + struct curltime Curl_now(void) { struct curltime now; - static LARGE_INTEGER freq; - static int isVistaOrGreater = -1; - if(isVistaOrGreater == -1) { - if(Curl_verify_windows_version(6, 0, PLATFORM_WINNT, - VERSION_GREATER_THAN_EQUAL)) { - isVistaOrGreater = 1; - QueryPerformanceFrequency(&freq); - } - else - isVistaOrGreater = 0; - } - if(isVistaOrGreater == 1) { /* QPC timer might have issues pre-Vista */ + if(Curl_isVistaOrGreater) { /* QPC timer might have issues pre-Vista */ LARGE_INTEGER count; QueryPerformanceCounter(&count); - now.tv_sec = (time_t)(count.QuadPart / freq.QuadPart); - now.tv_usec = - (int)((count.QuadPart % freq.QuadPart) * 1000000 / freq.QuadPart); + now.tv_sec = (time_t)(count.QuadPart / Curl_freq.QuadPart); + now.tv_usec = (int)((count.QuadPart % Curl_freq.QuadPart) * 1000000 / + Curl_freq.QuadPart); } else { /* Disable /analyze warning that GetTickCount64 is preferred */ |