mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Add emulation of non-blocking sockets to the win32 socket/signal layer,
and use this in pq_getbyte_if_available. It's only a limited implementation which swithes the whole emulation layer no non-blocking mode, but that's enough as long as non-blocking is only used during a short period of time, and only one socket is accessed during this time.
This commit is contained in:
@ -6,13 +6,26 @@
|
||||
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/port/win32/socket.c,v 1.23 2010/01/02 16:57:50 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/port/win32/socket.c,v 1.24 2010/02/16 19:26:02 mha Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
/*
|
||||
* Indicate if pgwin32_recv() should operate in non-blocking mode.
|
||||
*
|
||||
* Since the socket emulation layer always sets the actual socket to
|
||||
* non-blocking mode in order to be able to deliver signals, we must
|
||||
* specify this in a separate flag if we actually need non-blocking
|
||||
* operation.
|
||||
*
|
||||
* This flag changes the behaviour *globally* for all socket operations,
|
||||
* so it should only be set for very short periods of time.
|
||||
*/
|
||||
int pgwin32_noblock = 0;
|
||||
|
||||
#undef socket
|
||||
#undef accept
|
||||
#undef connect
|
||||
@ -310,6 +323,16 @@ pgwin32_recv(SOCKET s, char *buf, int len, int f)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pgwin32_noblock)
|
||||
{
|
||||
/*
|
||||
* No data received, and we are in "emulated non-blocking mode", so return
|
||||
* indicating thta we'd block if we were to continue.
|
||||
*/
|
||||
errno = EWOULDBLOCK;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* No error, zero bytes (win2000+) or error+WSAEWOULDBLOCK (<=nt4) */
|
||||
|
||||
for (n = 0; n < 5; n++)
|
||||
|
Reference in New Issue
Block a user