Check for SIGHUP and process config file updates just after waiting
authorTom Lane
Tue, 24 Oct 2000 21:33:52 +0000 (21:33 +0000)
committerTom Lane
Tue, 24 Oct 2000 21:33:52 +0000 (21:33 +0000)
for input, not just before.

src/backend/postmaster/postmaster.c
src/backend/tcop/postgres.c

index 5276b6dcf1c6c1369d1ad5618a8bbdc827594c66..e752d5e88715a1bb212e5dd22f54cea6ba04e9d7 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.173 2000/10/21 15:43:26 vadim Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.174 2000/10/24 21:33:52 tgl Exp $
  *
  * NOTES
  *
@@ -803,14 +803,15 @@ ServerLoop(void)
        Port       *port;
        fd_set      rmask,
                    wmask;
-
 #ifdef USE_SSL
-       int         no_select = 0;
-
+       bool        no_select = false;
 #endif
 
-       memmove((char *) &rmask, (char *) &readmask, sizeof(fd_set));
-       memmove((char *) &wmask, (char *) &writemask, sizeof(fd_set));
+       /*
+        * Wait for something to happen.
+        */
+       memcpy((char *) &rmask, (char *) &readmask, sizeof(fd_set));
+       memcpy((char *) &wmask, (char *) &writemask, sizeof(fd_set));
 
 #ifdef USE_SSL
        for (curr = DLGetHead(PortList); curr; curr = DLGetSucc(curr))
@@ -818,17 +819,16 @@ ServerLoop(void)
            if (((Port *) DLE_VAL(curr))->ssl &&
                SSL_pending(((Port *) DLE_VAL(curr))->ssl) > 0)
            {
-               no_select = 1;
+               no_select = true;
                break;
            }
        }
-       PG_SETMASK(&UnBlockSig);
        if (no_select)
            FD_ZERO(&rmask);    /* So we don't accept() anything below */
-       else
-#else
-       PG_SETMASK(&UnBlockSig);
 #endif
+
+       PG_SETMASK(&UnBlockSig);
+
        if (select(nSockets, &rmask, &wmask, (fd_set *) NULL,
                   (struct timeval *) NULL) < 0)
        {
@@ -838,6 +838,21 @@ ServerLoop(void)
                    progname, strerror(errno));
            return STATUS_ERROR;
        }
+
+       /*
+        * Block all signals until we wait again
+        */
+       PG_SETMASK(&BlockSig);
+
+       /*
+        * Respond to signals, if needed
+        */
+       if (got_SIGHUP)
+       {
+           got_SIGHUP = false;
+           ProcessConfigFile(PGC_SIGHUP);
+       }
+
        /*
         * Select a random seed at the time of first receiving a request.
         */
@@ -856,11 +871,8 @@ ServerLoop(void)
        }
 
        /*
-        * Block all signals
+        * new connection pending on our well-known port's socket?
         */
-       PG_SETMASK(&BlockSig);
-
-       /* new connection pending on our well-known port's socket */
 
 #ifdef HAVE_UNIX_SOCKETS
        if (ServerSock_UNIX != INVALID_SOCK &&
@@ -893,21 +905,12 @@ ServerLoop(void)
            Port       *port = (Port *) DLE_VAL(curr);
            int         status = STATUS_OK;
            Dlelem     *next;
-           int         readyread = 0;
 
+           if (FD_ISSET(port->sock, &rmask)
 #ifdef USE_SSL
-           if (port->ssl)
-           {
-               if (SSL_pending(port->ssl) ||
-                   FD_ISSET(port->sock, &rmask))
-                   readyread = 1;
-           }
-           else
+               || (port->ssl && SSL_pending(port->ssl))
 #endif
-           if (FD_ISSET(port->sock, &rmask))
-               readyread = 1;
-
-           if (readyread)
+               )
            {
                if (DebugLvl > 1)
                    fprintf(stderr, "%s: ServerLoop:\t\thandling reading %d\n",
@@ -997,13 +1000,7 @@ ServerLoop(void)
            }
 
            curr = next;
-       }
-
-       if (got_SIGHUP)
-       {
-           got_SIGHUP = false;
-           ProcessConfigFile(PGC_SIGHUP);
-       }
+       } /* loop over active ports */
    }
 }
 
@@ -1269,7 +1266,6 @@ reset_shared(int port)
 static void
 SIGHUP_handler(SIGNAL_ARGS)
 {
-   got_SIGHUP = true;
    if (Shutdown > SmartShutdown)
        return;
    got_SIGHUP = true;
index 04a7abb002f2fe1e087361794859db37de29d640..d4c37c91a07b508c3581deba6de6f9fa8e5a51b9 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.180 2000/10/07 14:39:14 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.181 2000/10/24 21:33:48 tgl Exp $
  *
  * NOTES
  *   this is the "main" module of the postgres backend and
@@ -1618,7 +1618,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
    if (!IsUnderPostmaster)
    {
        puts("\nPOSTGRES backend interactive interface ");
-       puts("$Revision: 1.180 $ $Date: 2000/10/07 14:39:14 $\n");
+       puts("$Revision: 1.181 $ $Date: 2000/10/24 21:33:48 $\n");
    }
 
    /*
@@ -1695,14 +1695,6 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
 
        parser_input = makeStringInfo();
 
-       /* XXX this could be moved after ReadCommand below to get more
-        * sensical behaviour */
-       if (got_SIGHUP)
-       {
-           got_SIGHUP = false;
-           ProcessConfigFile(PGC_SIGHUP);
-       }
-
        /* ----------------
         *   (1) tell the frontend we're ready for a new query.
         *
@@ -1738,7 +1730,18 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
        DisableNotifyInterrupt();
 
        /* ----------------
-        *   (5) process the command.
+        *   (5) check for any other interesting events that happened
+        *       while we slept.
+        * ----------------
+        */
+       if (got_SIGHUP)
+       {
+           got_SIGHUP = false;
+           ProcessConfigFile(PGC_SIGHUP);
+       }
+
+       /* ----------------
+        *   (6) process the command.
         * ----------------
         */
        switch (firstchar)
@@ -1766,7 +1769,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
                 * ----------------
                 */
            case 'Q':
-               if (strspn(parser_input->data, " \t\n") == parser_input->len)
+               if (strspn(parser_input->data, " \t\r\n") == parser_input->len)
                {
                    /* ----------------
                     *  if there is nothing in the input buffer, don't bother