Commit 176e9055 authored by Nick Mathewson's avatar Nick Mathewson 🐘
Browse files

Probably broken attempt to improve tor_gettimeofday granularity on windows.


svn:r4683
parent d90841ff
Loading
Loading
Loading
Loading
+22 −1
Changes for src/common/compat.c: 22 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ const char compat_c_id[] = "$Id$";

#ifdef MS_WINDOWS
#include <process.h>

#endif
#ifdef HAVE_UNAME
#include <sys/utsname.h>
@@ -819,7 +820,27 @@ spawn_exit()
void
tor_gettimeofday(struct timeval *timeval)
{
#ifdef HAVE_GETTIMEOFDAY
#ifdef MS_WINDOWS
  /* Epoch bias copied from perl: number of units between windows epoch and
   * unix epoch. */
#define EPOCH_BIAS U64_LITERAL(116444736000000000)
#define UNITS_PER_SEC U64_LITERAL(10000000)
#define USEC_PER_SEC U64_LITERAL(1000000)
#define UNITS_PER_USEC U64_LITERAL(10)
  union {
    uint64_t ft_64;
    FILETIME ft_ft;
  } ft;
  /* number of 100-nsec units since Jan 1, 1601 */
  GetSystemTimeAsFileTime(&ft.ft_ft);
  if (ft.ft_64 < EPOCH_BIAS) {
    log_fn(LOG_ERR, "System time is before 1970; failing.");
    exit(1);
  }
  ft.ft_64 -= EPOCH_BIAS;
  tv->tv_sec = ft.ft_64 / UNITS_PER_SEC;
  tv->tv_usec = (ft.ft_64 / UNITS_PER_USEC) % USEC_PER_SEC;
#elif defined(HAVE_GETTIMEOFDAY)
  if (gettimeofday(timeval, NULL)) {
    log_fn(LOG_ERR, "gettimeofday failed.");
    /* If gettimeofday dies, we have either given a bad timezone (we didn't),