From 64235fecc6d377690444ca3702257b5e39ed3413 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Sat, 21 Feb 2015 12:13:47 -0500 Subject: [PATCH] Don't require users of src/port/gettimeofday.c to initialize it. Commit 8001fe67a3d66c95861ce1f7075ef03953670d13 introduced this requirement, but per discussion, we want to avoid requirements of this type to make things easier on the calling code. An especially important consideration is that this may be used in frontend code, not just the backend. Asif Naeem, reviewed by Michael Paquier --- src/backend/main/main.c | 6 ------ src/include/port.h | 2 -- src/port/gettimeofday.c | 20 ++++++++++++-------- 3 files changed, 12 insertions(+), 16 deletions(-) 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); } /*