aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2002-10-16 02:55:30 +0000
committerBruce Momjian <bruce@momjian.us>2002-10-16 02:55:30 +0000
commitfacb72007333d9c0acff0f8d64b36d2c4a262665 (patch)
tree63f508de2ef7573ebdd740889b271f2f9101a3d3 /src
parent8a96c50ec98e9d24b25b6bfed359da7778a032d4 (diff)
downloadpostgresql-facb72007333d9c0acff0f8d64b36d2c4a262665.tar.gz
postgresql-facb72007333d9c0acff0f8d64b36d2c4a262665.zip
Fix connection_timeout to use time() and handle timeout == 1.
Code cleanup.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpq/fe-connect.c40
-rw-r--r--src/interfaces/libpq/fe-misc.c12
-rw-r--r--src/interfaces/libpq/libpq-int.h5
3 files changed, 22 insertions, 35 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 01040575846..7dd13f8a401 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.210 2002/10/15 01:48:25 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.211 2002/10/16 02:55:30 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1052,10 +1052,7 @@ connectDBComplete(PGconn *conn)
{
PostgresPollingStatusType flag = PGRES_POLLING_WRITING;
- time_t finish_time = 0,
- current_time;
- struct timeval remains,
- *rp = NULL;
+ time_t finish_time = -1;
if (conn == NULL || conn->status == CONNECTION_BAD)
return 0;
@@ -1065,20 +1062,21 @@ connectDBComplete(PGconn *conn)
*/
if (conn->connect_timeout != NULL)
{
- remains.tv_sec = atoi(conn->connect_timeout);
- if (!remains.tv_sec)
+ int timeout = atoi(conn->connect_timeout);
+
+ if (timeout == 0)
{
conn->status = CONNECTION_BAD;
return 0;
}
- remains.tv_usec = 0; /* We don't use subsecond timing */
- rp = &remains;
-
+ /* Rounding could cause connection to fail;we need at least 2 secs */
+ if (timeout == 1)
+ timeout++;
/* calculate the finish time based on start + timeout */
- finish_time = time((time_t *) NULL) + remains.tv_sec;
+ finish_time = time(NULL) + timeout;
}
- while (rp == NULL || remains.tv_sec > 0)
+ while (finish_time == -1 || time(NULL) >= finish_time)
{
/*
* Wait, if necessary. Note that the initial state (just after
@@ -1094,7 +1092,7 @@ connectDBComplete(PGconn *conn)
return 1; /* success! */
case PGRES_POLLING_READING:
- if (pqWaitTimed(1, 0, conn, rp))
+ if (pqWaitTimed(1, 0, conn, finish_time))
{
conn->status = CONNECTION_BAD;
return 0;
@@ -1102,7 +1100,7 @@ connectDBComplete(PGconn *conn)
break;
case PGRES_POLLING_WRITING:
- if (pqWaitTimed(0, 1, conn, rp))
+ if (pqWaitTimed(0, 1, conn, finish_time))
{
conn->status = CONNECTION_BAD;
return 0;
@@ -1119,20 +1117,6 @@ connectDBComplete(PGconn *conn)
* Now try to advance the state machine.
*/
flag = PQconnectPoll(conn);
-
- /*
- * If connecting timeout is set, calculate remaining time.
- */
- if (rp != NULL)
- {
- if (time(&current_time) == -1)
- {
- conn->status = CONNECTION_BAD;
- return 0;
- }
-
- remains.tv_sec = finish_time - current_time;
- }
}
conn->status = CONNECTION_BAD;
return 0;
diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c
index 7b5a2eeb152..6cb7013514e 100644
--- a/src/interfaces/libpq/fe-misc.c
+++ b/src/interfaces/libpq/fe-misc.c
@@ -25,7 +25,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.83 2002/10/14 18:11:17 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.84 2002/10/16 02:55:30 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -779,11 +779,11 @@ pqFlush(PGconn *conn)
int
pqWait(int forRead, int forWrite, PGconn *conn)
{
- return pqWaitTimed(forRead, forWrite, conn, (const struct timeval *) NULL);
+ return pqWaitTimed(forRead, forWrite, conn, -1);
}
int
-pqWaitTimed(int forRead, int forWrite, PGconn *conn, const struct timeval *timeout)
+pqWaitTimed(int forRead, int forWrite, PGconn *conn, time_t finish_time)
{
fd_set input_mask;
fd_set output_mask;
@@ -820,7 +820,7 @@ retry5:
FD_SET(conn->sock, &output_mask);
FD_SET(conn->sock, &except_mask);
- if (NULL != timeout)
+ if (finish_time != -1)
{
/*
* select() may modify timeout argument on some platforms so
@@ -831,7 +831,9 @@ retry5:
* incorrect timings when select() is interrupted.
* bjm 2002-10-14
*/
- tmp_timeout = *timeout;
+ if ((tmp_timeout.tv_sec = finish_time - time(NULL)) < 0)
+ tmp_timeout.tv_sec = 0; /* possible? */
+ tmp_timeout.tv_usec = 0;
ptmp_timeout = &tmp_timeout;
}
if (select(conn->sock + 1, &input_mask, &output_mask,
diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h
index e2ee2491f8a..cde2b2d2b05 100644
--- a/src/interfaces/libpq/libpq-int.h
+++ b/src/interfaces/libpq/libpq-int.h
@@ -12,7 +12,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: libpq-int.h,v 1.59 2002/10/14 17:15:11 momjian Exp $
+ * $Id: libpq-int.h,v 1.60 2002/10/16 02:55:30 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -340,7 +340,8 @@ extern int pqReadData(PGconn *conn);
extern int pqFlush(PGconn *conn);
extern int pqSendSome(PGconn *conn);
extern int pqWait(int forRead, int forWrite, PGconn *conn);
-extern int pqWaitTimed(int forRead, int forWrite, PGconn *conn, const struct timeval *timeout);
+extern int pqWaitTimed(int forRead, int forWrite, PGconn *conn,
+ time_t finish_time);
extern int pqReadReady(PGconn *conn);
extern int pqWriteReady(PGconn *conn);