Add compat file for dynamically loading the functions that MinGW is missing
authorMagnus Hagander
Mon, 29 Oct 2007 12:35:41 +0000 (12:35 +0000)
committerMagnus Hagander
Mon, 29 Oct 2007 12:35:41 +0000 (12:35 +0000)
the imports for. Add RegisterWaitForSingleObject() to the list of such
functions, which should take care of the current buildfarm breakage.

src/backend/port/win32/Makefile
src/backend/port/win32/mingwcompat.c [new file with mode: 0644]

index 620d921eddbf933e808aee752520fd24062e5aec..6aabc2123951866c331aab38d2b0d6d7b08a41aa 100644 (file)
@@ -4,7 +4,7 @@
 #    Makefile for backend/port/win32
 #
 # IDENTIFICATION
-#    $PostgreSQL: pgsql/src/backend/port/win32/Makefile,v 1.10 2007/03/21 14:39:23 mha Exp $
+#    $PostgreSQL: pgsql/src/backend/port/win32/Makefile,v 1.11 2007/10/29 12:35:41 mha Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -12,7 +12,7 @@ subdir = src/backend/port/win32
 top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 
-OBJS = timer.o socket.o signal.o security.o
+OBJS = timer.o socket.o signal.o security.o mingwcompat.o
 
 all: SUBSYS.o
 
diff --git a/src/backend/port/win32/mingwcompat.c b/src/backend/port/win32/mingwcompat.c
new file mode 100644 (file)
index 0000000..da45854
--- /dev/null
@@ -0,0 +1,77 @@
+/*-------------------------------------------------------------------------
+ *
+ * mingwcompat.c
+ *   MinGW compatibility functions
+ *
+ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ *   $PostgreSQL: pgsql/src/backend/port/win32/mingwcompat.c,v 1.1 2007/10/29 12:35:41 mha Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+/*
+ * This file contains loaders for functions that are missing in the MinGW 
+ * import libraries. It's only for actual Win32 API functions, so they are
+ * all present in proper Win32 compilers.
+ */
+#ifndef WIN32_ONLY_COMPILER
+
+static HMODULE kernel32 = NULL;
+
+/*
+ * Load DLL file just once regardless of how many functions
+ * we load/call in it.
+ */
+static void
+LoadKernel32()
+{
+   if (kernel32 != NULL)
+       return;
+
+   kernel32 = LoadLibraryEx("kernel32.dll", NULL, 0);
+   if (kernel32 == NULL)
+       ereport(FATAL,
+               (errmsg_internal("could not load kernel32.dll: %d",
+                                (int)GetLastError())));
+}
+
+
+/*
+ * Replacement for RegisterWaitForSingleObject(), which lives in
+ * kernel32.dll·
+ */
+typedef BOOL (WINAPI * __RegisterWaitForSingleObject)
+   (PHANDLE, HANDLE, WAITORTIMERCALLBACK, PVOID, ULONG, ULONG);
+__RegisterWaitForSingleObject _RegisterWaitForSingleObject = NULL;
+
+BOOL WINAPI 
+RegisterWaitForSingleObject(PHANDLE phNewWaitObject,
+                           HANDLE hObject,
+                           WAITORTIMERCALLBACK Callback,
+                           PVOID Context,
+                           ULONG dwMilliseconds,
+                           ULONG dwFlags)
+{
+   if (_RegisterWaitForSingleObject == NULL)
+   {
+       LoadKernel32();
+
+       _RegisterWaitForSingleObject = (__RegisterWaitForSingleObject)
+           GetProcAddress(kernel32, "RegisterWaitForSingleObject");
+
+       if (_RegisterWaitForSingleObject == NULL)
+           ereport(FATAL,
+                   (errmsg_internal("could not locate RegisterWaitForSingleObject in kernel32.dll: %d",
+                                    (int)GetLastError())));
+   }
+
+   return (_RegisterWaitForSingleObject)
+       (phNewWaitObject, hObject, Callback, Context, dwMilliseconds, dwFlags);
+}
+
+#endif
+