Curl_now: figure out windows version in win32_init

... and avoid use of static variables that aren't thread safe.

Fixes regression from e9ababd4f5 (present in the 7.64.0 release)

Reported-by: Paul Groke
Fixes #3572
Closes #3573
This commit is contained in:
Daniel Stenberg 2019-02-14 17:08:29 +01:00
Родитель 208c77713a
Коммит ca597ad34a
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 5CC908FDB71E12C2
2 изменённых файлов: 24 добавлений и 16 удалений

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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 */