Here's a summary of relevant parts of the communications I've had with
Microsoft PSS regarding the issues with select() and APCs:
* Actually it is caused by the fact the Winsock (and also IP Helper)
APIs use APCs in their implementation to receive Network events. This
is not a bug but simply the way Winsock are implemented.
* He has confirmed this is not included in the docs, so it wasn't
somehting we missed.
* Use a global Boolean variable as you have already said to flag the APC
callback; I discuss with one colleague from the Windows team about
potential side effect and he confirms me it is a valid solution.
Furthermore there is no way to determine that a select call has been
interrupted by a Queued APC callback.
* Create a specific thread to handle the APC callback and prevent
disturbing the Select() call; If a new thread reserves some memory for
its own needs, the memory is only reserved and not committed. Only a few
pages (4KByte) are actually committed at the beginning, and as a
consequence resources should not be a problem here.
Based on my discussions with the PSS guy, I think going with the thread
method is best. This way we fix only the point where we actually have a
problem (instead of working around th eproblem *after* it occured, and
working around it in cases when it does not exist). The resources used
should be insignificant. Also, now the workaround is in force only when
a process dies - if we redefined select() completely it would affect all
other codepaths using select() as well.
I'll send a patch implementing the thread-way of fixing this to the
patches list in a minute. It fixes the problems for me (the
pgsql-hackers-win32 by date
|Next:||From: Tom.Zschockelt||Date: 2004-03-23 13:20:03|
|Subject: connect error|
|Previous:||From: Tom Lane||Date: 2004-03-22 16:47:32|
|Subject: Re: compile errors |