]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Check for SIGHUP and process config file updates just after waiting
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 24 Oct 2000 21:33:52 +0000 (21:33 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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