diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 582198fbe1..2f07a58a4c 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -261,12 +261,6 @@ startup_hacks(const char *progname) /* In case of general protection fault, don't show GUI popup box */ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); - -#ifndef HAVE_GETTIMEOFDAY - /* Figure out which syscall to use to capture timestamp information */ - init_win32_gettimeofday(); -#endif - } #endif /* WIN32 */ diff --git a/src/include/port.h b/src/include/port.h index 26d7fcd672..a1ab42e3da 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -328,8 +328,6 @@ extern FILE *pgwin32_popen(const char *command, const char *type); #ifndef HAVE_GETTIMEOFDAY /* Last parameter not used */ extern int gettimeofday(struct timeval * tp, struct timezone * tzp); -/* On windows we need to call some backend start setup for accurate timing */ -extern void init_win32_gettimeofday(void); #endif #else /* !WIN32 */ diff --git a/src/port/gettimeofday.c b/src/port/gettimeofday.c index eabf161e04..c700d997c9 100644 --- a/src/port/gettimeofday.c +++ b/src/port/gettimeofday.c @@ -30,6 +30,7 @@ #include +static void init_gettimeofday(LPFILETIME lpSystemTimeAsFileTime); /* FILETIME of Jan 1 1970 00:00:00, the PostgreSQL epoch */ static const unsigned __int64 epoch = UINT64CONST(116444736000000000); @@ -49,14 +50,15 @@ static const unsigned __int64 epoch = UINT64CONST(116444736000000000); typedef VOID (WINAPI *PgGetSystemTimeFn)(LPFILETIME); /* Storage for the function we pick at runtime */ -static PgGetSystemTimeFn pg_get_system_time = NULL; +static PgGetSystemTimeFn pg_get_system_time = &init_gettimeofday; /* - * During backend startup, determine if GetSystemTimePreciseAsFileTime is - * available and use it; if not, fall back to GetSystemTimeAsFileTime. + * One time initializer. Determine whether GetSystemTimePreciseAsFileTime + * is available and if so, plan to use it; if not, fall back to + * GetSystemTimeAsFileTime. */ -void -init_win32_gettimeofday(void) +static void +init_gettimeofday(LPFILETIME lpSystemTimeAsFileTime) { /* * Because it's guaranteed that kernel32.dll will be linked into our @@ -80,14 +82,16 @@ init_win32_gettimeofday(void) * The expected error from GetLastError() is ERROR_PROC_NOT_FOUND, if * the function isn't present. No other error should occur. * - * It's too early in startup to elog(...) if we get some unexpected - * error, and not serious enough to warrant a fprintf to stderr about - * it or save the error and report it later. So silently fall back to + * We can't report an error here because this might be running in + * frontend code; and even if we're in the backend, it's too early + * to elog(...) if we get some unexpected error. Also, it's not a + * serious problem, so just silently fall back to * GetSystemTimeAsFileTime irrespective of why the failure occurred. */ pg_get_system_time = &GetSystemTimeAsFileTime; } + (*pg_get_system_time)(lpSystemTimeAsFileTime); } /*