]> granicus.if.org Git - postgresql/commitdiff
Don't require users of src/port/gettimeofday.c to initialize it.
authorRobert Haas <rhaas@postgresql.org>
Sat, 21 Feb 2015 17:13:47 +0000 (12:13 -0500)
committerRobert Haas <rhaas@postgresql.org>
Sat, 21 Feb 2015 17:17:04 +0000 (12:17 -0500)
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
src/include/port.h
src/port/gettimeofday.c

index 582198fbe15a2afafc51437c87ca3e81a9e13967..2f07a58a4c89b5d45606b14f1b0f697db6a23bda 100644 (file)
@@ -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 */
 
index 26d7fcd6721d60d2e5374ecf4563f110bba4a5ec..a1ab42e3da66482d30217120d220c04f61dd869b 100644 (file)
@@ -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 */
 
index eabf161e04a14d960d1835e9e8a93b1bb78d420e..c700d997c9ccf8842da6e7076bdb3668af706fb0 100644 (file)
@@ -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);
 }
 
 /*