On Sun, Aug 7, 2022 at 11:22 AM Tom Lane <t...@sss.pgh.pa.us> wrote:
> Thomas Munro <thomas.mu...@gmail.com> writes:
> > I also wonder if half the stuff in win32gettimeofday.c can be deleted.
> > From some light googling, it looks like
> > GetSystemTimePreciseAsFileTime() can just be called directly on
> > Windows 8+ (and we now require 10+), and that kernel32.dll malarky was
> > for older systems?
>
> Yeah, Microsoft's man page for it just says to include sysinfoapi.h
> (which we aren't) and then it should work on supported versions.

This looks good on CI (well I haven't waited for it to finish yet, but
MSVC compiles it without warning and we're most of the way through the
tests...).
From 6498faf80f5f2859e9228baf85f7e7974a29f4dc Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.mu...@gmail.com>
Date: Sun, 7 Aug 2022 11:57:23 +1200
Subject: [PATCH] Simplify gettimeofday for Windows.

Previously we bothered to forward-declare a struct timezone, following
man pages on typical systems, but POSIX actually says the argument
(which we ignore anyway) is void *.  Drop a line.

Previously we did extra work to select between Windows APIs needed on
older releases, but now we can just use the higher resolution function
directly.

Discussion: https://postgr.es/m/CA%2BhUKGKwRpvGfcfq2qNVAQS2Wg1B9eA9QRhAmVSyJt1zsCN2sQ%40mail.gmail.com
---
 src/include/port/win32_port.h |  3 +-
 src/port/win32gettimeofday.c  | 59 +++--------------------------------
 2 files changed, 5 insertions(+), 57 deletions(-)

diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h
index 79451a00f9..12b4cf6cdb 100644
--- a/src/include/port/win32_port.h
+++ b/src/include/port/win32_port.h
@@ -181,9 +181,8 @@
 
 /* MinW has gettimeofday(), but MSVC doesn't */
 #ifdef _MSC_VER
-struct timezone;
 /* Last parameter not used */
-extern int	gettimeofday(struct timeval *tp, struct timezone *tzp);
+extern int	gettimeofday(struct timeval *tp, void *tzp);
 #endif
 
 /* for setitimer in backend/port/win32/timer.c */
diff --git a/src/port/win32gettimeofday.c b/src/port/win32gettimeofday.c
index 0464548758..a7eddddaad 100644
--- a/src/port/win32gettimeofday.c
+++ b/src/port/win32gettimeofday.c
@@ -28,6 +28,8 @@
 
 #include "c.h"
 
+#include <sysinfoapi.h>
+
 #include <sys/time.h>
 
 /* FILETIME of Jan 1 1970 00:00:00, the PostgreSQL epoch */
@@ -40,59 +42,6 @@ static const unsigned __int64 epoch = UINT64CONST(116444736000000000);
 #define FILETIME_UNITS_PER_SEC	10000000L
 #define FILETIME_UNITS_PER_USEC 10
 
-/*
- * Both GetSystemTimeAsFileTime and GetSystemTimePreciseAsFileTime share a
- * signature, so we can just store a pointer to whichever we find. This
- * is the pointer's type.
- */
-typedef VOID(WINAPI * PgGetSystemTimeFn) (LPFILETIME);
-
-/* One-time initializer function, must match that signature. */
-static void WINAPI init_gettimeofday(LPFILETIME lpSystemTimeAsFileTime);
-
-/* Storage for the function we pick at runtime */
-static PgGetSystemTimeFn pg_get_system_time = &init_gettimeofday;
-
-/*
- * One time initializer.  Determine whether GetSystemTimePreciseAsFileTime
- * is available and if so, plan to use it; if not, fall back to
- * GetSystemTimeAsFileTime.
- */
-static void WINAPI
-init_gettimeofday(LPFILETIME lpSystemTimeAsFileTime)
-{
-	/*
-	 * Because it's guaranteed that kernel32.dll will be linked into our
-	 * address space already, we don't need to LoadLibrary it and worry about
-	 * closing it afterwards, so we're not using Pg's dlopen/dlsym() wrapper.
-	 *
-	 * We'll just look up the address of GetSystemTimePreciseAsFileTime if
-	 * present.
-	 *
-	 * While we could look up the Windows version and skip this on Windows
-	 * versions below Windows 8 / Windows Server 2012 there isn't much point,
-	 * and determining the windows version is its self somewhat Windows
-	 * version and development SDK specific...
-	 */
-	pg_get_system_time = (PgGetSystemTimeFn) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
-															"GetSystemTimePreciseAsFileTime");
-	if (pg_get_system_time == NULL)
-	{
-		/*
-		 * The expected error from GetLastError() is ERROR_PROC_NOT_FOUND, if
-		 * the function isn't present. No other error should occur.
-		 *
-		 * 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);
-}
 
 /*
  * timezone information is stored outside the kernel so tzp isn't used anymore.
@@ -101,12 +50,12 @@ init_gettimeofday(LPFILETIME lpSystemTimeAsFileTime)
  * elapsed_time().
  */
 int
-gettimeofday(struct timeval *tp, struct timezone *tzp)
+gettimeofday(struct timeval *tp, void *tzp)
 {
 	FILETIME	file_time;
 	ULARGE_INTEGER ularge;
 
-	(*pg_get_system_time) (&file_time);
+	GetSystemTimePreciseAsFileTime(&file_time);
 	ularge.LowPart = file_time.dwLowDateTime;
 	ularge.HighPart = file_time.dwHighDateTime;
 
-- 
2.37.1

Reply via email to