aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/main/main.c6
-rw-r--r--src/include/port.h2
-rw-r--r--src/port/gettimeofday.c20
3 files changed, 12 insertions, 16 deletions
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index 582198fbe15..2f07a58a4c8 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 26d7fcd6721..a1ab42e3da6 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 eabf161e04a..c700d997c9c 100644
--- a/src/port/gettimeofday.c
+++ b/src/port/gettimeofday.c
@@ -30,6 +30,7 @@
#include <sys/time.h>
+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);
}
/*