Re: droped out precise time calculations in src/interfaces/libpq/fe-connect.c - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: droped out precise time calculations in src/interfaces/libpq/fe-connect.c
Date
Msg-id 200210141714.g9EHEM926154@candle.pha.pa.us
Whole thread Raw
In response to Re: droped out precise time calculations in src/interfaces/libpq/fe-connect.c  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > That whole remains structure should be a time_t variable, and then we
> > _know_ we can't assume it is signed.  The use of timeval should
> > happen only in pqWaitTimed because it has to use select().
>
> I think it's fine to use struct timeval as the parameter type for
> pqWaitTimed.  This particular caller of pqWaitTimed has no need for
> sub-second wait precision, but that doesn't mean we might not want it
> for other purposes later.

That was a question:  whether pqWaitTimed() was something exported by
libpq and therefore something that has an API that shouldn't change.  I
see it in libpq-int.h, which I think means it isn't exported, but yes,
there could be later cases where we need subsecond stuff.

I have applied the following patch to get us a little closer to sanity.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/interfaces/libpq/fe-connect.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-connect.c,v
retrieving revision 1.208
diff -c -c -r1.208 fe-connect.c
*** src/interfaces/libpq/fe-connect.c    11 Oct 2002 04:41:59 -0000    1.208
--- src/interfaces/libpq/fe-connect.c    14 Oct 2002 17:10:19 -0000
***************
*** 1071,1085 ****
              conn->status = CONNECTION_BAD;
              return 0;
          }
!         remains.tv_usec = 0;
          rp = &remains;

          /* calculate the finish time based on start + timeout */
          finish_time = time((time_t *) NULL) + remains.tv_sec;
      }

!     while (rp == NULL || remains.tv_sec > 0 ||
!            (remains.tv_sec == 0 && remains.tv_usec > 0))
      {
          /*
           * Wait, if necessary.    Note that the initial state (just after
--- 1071,1084 ----
              conn->status = CONNECTION_BAD;
              return 0;
          }
!         remains.tv_usec = 0;    /* We don't use subsecond timing */
          rp = &remains;

          /* calculate the finish time based on start + timeout */
          finish_time = time((time_t *) NULL) + remains.tv_sec;
      }

!     while (rp == NULL || remains.tv_sec > 0)
      {
          /*
           * Wait, if necessary.    Note that the initial state (just after
***************
*** 1133,1139 ****
              }

              remains.tv_sec = finish_time - current_time;
-             remains.tv_usec = 0;
          }
      }
      conn->status = CONNECTION_BAD;
--- 1132,1137 ----
Index: src/interfaces/libpq/fe-misc.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-misc.c,v
retrieving revision 1.80
diff -c -c -r1.80 fe-misc.c
*** src/interfaces/libpq/fe-misc.c    3 Oct 2002 17:09:42 -0000    1.80
--- src/interfaces/libpq/fe-misc.c    14 Oct 2002 17:10:22 -0000
***************
*** 783,796 ****
  }

  int
! pqWaitTimed(int forRead, int forWrite, PGconn *conn, const struct timeval * timeout)
  {
      fd_set        input_mask;
      fd_set        output_mask;
      fd_set        except_mask;

      struct timeval tmp_timeout;
-     struct timeval *ptmp_timeout = NULL;

      if (conn->sock < 0)
      {
--- 783,795 ----
  }

  int
! pqWaitTimed(int forRead, int forWrite, PGconn *conn, const struct timeval *timeout)
  {
      fd_set        input_mask;
      fd_set        output_mask;
      fd_set        except_mask;

      struct timeval tmp_timeout;

      if (conn->sock < 0)
      {
***************
*** 823,836 ****
          if (NULL != timeout)
          {
              /*
!              * select may modify timeout argument on some platforms use
!              * copy
               */
              tmp_timeout = *timeout;
-             ptmp_timeout = &tmp_timeout;
          }
          if (select(conn->sock + 1, &input_mask, &output_mask,
!                    &except_mask, ptmp_timeout) < 0)
          {
              if (SOCK_ERRNO == EINTR)
                  goto retry5;
--- 822,834 ----
          if (NULL != timeout)
          {
              /*
!              *     select() may modify timeout argument on some platforms so
!              *    use copy
               */
              tmp_timeout = *timeout;
          }
          if (select(conn->sock + 1, &input_mask, &output_mask,
!                    &except_mask, &tmp_timeout) < 0)
          {
              if (SOCK_ERRNO == EINTR)
                  goto retry5;
Index: src/interfaces/libpq/libpq-int.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/libpq-int.h,v
retrieving revision 1.58
diff -c -c -r1.58 libpq-int.h
*** src/interfaces/libpq/libpq-int.h    3 Oct 2002 17:09:42 -0000    1.58
--- src/interfaces/libpq/libpq-int.h    14 Oct 2002 17:10:24 -0000
***************
*** 340,346 ****
  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    pqReadReady(PGconn *conn);
  extern int    pqWriteReady(PGconn *conn);

--- 340,346 ----
  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    pqReadReady(PGconn *conn);
  extern int    pqWriteReady(PGconn *conn);


pgsql-hackers by date:

Previous
From: Justin Clift
Date:
Subject: Turkish version of the PostgreSQL "Advocacy and Marketing" site is ready
Next
From: Bruce Momjian
Date:
Subject: Re: droped out precise time calculations in src/interfaces/libpq/fe-connect.c