Unverified Commit ca597ad3 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Curl_now: figure out windows version in win32_init

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

Fixes regression from e9ababd4 (present in the 7.64.0 release)

Reported-by: Paul Groke
Fixes #3572
Closes #3573
parent 208c7771
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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;
}

+8 −16
Original line number Diff line number Diff line
@@ -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  */