Re: Review of VS 2010 support patches

From: Brar Piening <brar(at)gmx(dot)de>
To: Andrew Dunstan <andrew(at)dunslane(dot)net>
Cc: Craig Ringer <craig(at)postnewspapers(dot)com(dot)au>, PG Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Review of VS 2010 support patches
Date: 2011-12-28 22:44:25
Message-ID: 4EFB9BC9.2090505@gmx.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Andrew Dunstan wrote:
> Can you narrow down exactly what in that commit broke VS 2010? Are
> there any compiler warnings?

I was able to nail down the problem.

Running the regression tests (vcregress check) gives the following messages:
<snip>
============== creating temporary installation ==============
============== initializing database system ==============
============== starting postmaster ==============

pg_regress: postmaster did not respond within 60 seconds
Examine src/test/regress/log/postmaster.log for the reason
</snip>

postmaster.log shows the following messages:
<snip>
LOG: database system was shut down at 2011-12-28 22:09:46 CET
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
LOG: incomplete startup packet
</snip>
with the line "LOG: incomplete startup packet" repeated several times
afterwards.

The problem seems to be related to an invalid socket error constant.
EWOULDBLOCK gets expanded to 140 with commit
1a0c76c32fe470142d3663dd84ac960d75a4e8db applied whereas it got expanded
to 10035L before.
Adding the following code to src/include/port/win32.h restores the
former (running) behaviour :
<snip>
#if _MSC_VER >= 1600
#pragma warning(disable:4005)
#define EWOULDBLOCK WSAEWOULDBLOCK
#endif
</snip>

But according to the winsock docs this minimal invasive surgery isn't
really appropriate (at least for visual c).
http://msdn.microsoft.com/en-us/library/windows/desktop/ms737828(v=vs.85).aspx

It appears that VS 2010 and Windows SDK 7.1 now have an extended errno.h
that defines quite a few of the E* constants:
<snip>
/* POSIX SUPPLEMENT */
#define EADDRINUSE 100
#define EADDRNOTAVAIL 101
[...]
#define ETXTBSY 139
#define EWOULDBLOCK 140
</snip>

Here we probably run into the conflict that winsock2.h has always been
warning about:
<snip>
/*
* Windows Sockets errors redefined as regular Berkeley error constants.
* These are commented out in Windows NT to avoid conflicts with errno.h.
* Use the WSA constants instead.
*/
#if 0
#define EWOULDBLOCK WSAEWOULDBLOCK
[...]
#define ESTALE WSAESTALE
#define EREMOTE WSAEREMOTE
#endif
</snip>

A possible solution would be to use something like PGEWOULDBLOCK and
similiar constants wherever socket errors are used and set them to the
WSAE* constants on windows and the E* constants on other platforms.

Anyhow, this would be ways beyond the scope of my patch and there will
probably be a better solution to be suggested from a real C hacker.

Regards,

Brar

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2011-12-28 23:08:58 Re: spinlocks on HP-UX
Previous Message Tatsuo Ishii 2011-12-28 22:27:57 Re: spinlocks on HP-UX