Commit 811be893 authored by Magnus Hagander's avatar Magnus Hagander

Add compat file for dynamically loading the functions that MinGW is missing

the imports for. Add RegisterWaitForSingleObject() to the list of such
functions, which should take care of the current buildfarm breakage.
parent 6f14effb
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# Makefile for backend/port/win32 # Makefile for backend/port/win32
# #
# IDENTIFICATION # 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 ...@@ -12,7 +12,7 @@ subdir = src/backend/port/win32
top_builddir = ../../../.. top_builddir = ../../../..
include $(top_builddir)/src/Makefile.global 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 all: SUBSYS.o
......
/*-------------------------------------------------------------------------
*
* 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment