pqWait() should check for exception status as well as read or write
ready. It appears that most (all?) Unixen will consider a socket to be read or write ready if it has an error condition, but of course Microsoft does things differently.
This commit is contained in:
parent
8484f66923
commit
fc0d3f1447
@ -25,7 +25,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.47 2001/03/22 04:01:26 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.48 2001/03/31 23:13:30 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -712,12 +712,17 @@ pqFlush(PGconn *conn)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
/* pqWait: wait until we can read or write the connection socket
|
/* pqWait: wait until we can read or write the connection socket
|
||||||
|
*
|
||||||
|
* We also stop waiting and return if the kernel flags an exception condition
|
||||||
|
* on the socket. The actual error condition will be detected and reported
|
||||||
|
* when the caller tries to read or write the socket.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
pqWait(int forRead, int forWrite, PGconn *conn)
|
pqWait(int forRead, int forWrite, PGconn *conn)
|
||||||
{
|
{
|
||||||
fd_set input_mask;
|
fd_set input_mask;
|
||||||
fd_set output_mask;
|
fd_set output_mask;
|
||||||
|
fd_set except_mask;
|
||||||
|
|
||||||
if (conn->sock < 0)
|
if (conn->sock < 0)
|
||||||
{
|
{
|
||||||
@ -731,11 +736,13 @@ pqWait(int forRead, int forWrite, PGconn *conn)
|
|||||||
retry:
|
retry:
|
||||||
FD_ZERO(&input_mask);
|
FD_ZERO(&input_mask);
|
||||||
FD_ZERO(&output_mask);
|
FD_ZERO(&output_mask);
|
||||||
|
FD_ZERO(&except_mask);
|
||||||
if (forRead)
|
if (forRead)
|
||||||
FD_SET(conn->sock, &input_mask);
|
FD_SET(conn->sock, &input_mask);
|
||||||
if (forWrite)
|
if (forWrite)
|
||||||
FD_SET(conn->sock, &output_mask);
|
FD_SET(conn->sock, &output_mask);
|
||||||
if (select(conn->sock + 1, &input_mask, &output_mask, (fd_set *) NULL,
|
FD_SET(conn->sock, &except_mask);
|
||||||
|
if (select(conn->sock + 1, &input_mask, &output_mask, &except_mask,
|
||||||
(struct timeval *) NULL) < 0)
|
(struct timeval *) NULL) < 0)
|
||||||
{
|
{
|
||||||
if (errno == EINTR)
|
if (errno == EINTR)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user