Fix connection_timeout to use time() and handle timeout == 1.
authorBruce Momjian <bruce@momjian.us>
Wed, 16 Oct 2002 02:55:30 +0000 (02:55 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 16 Oct 2002 02:55:30 +0000 (02:55 +0000)
Code cleanup.

src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-misc.c
src/interfaces/libpq/libpq-int.h

index 0104057584645b8a39dceb263470b6250111c5e4..7dd13f8a401e76aa7127c8f462207639bc6f8920 100644 (file)
@@ -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;
index 7b5a2eeb15208c04c118f52743f8067d584b8e95..6cb7013514eb302b169dc6a883989a85261e049b 100644 (file)
@@ -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,
index e2ee2491f8a5a2c861e809cf9b94ab6d7077d844..cde2b2d2b05f2ff0ee61537a5b6d9a7c6073c5ec 100644 (file)
@@ -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);