From 612f1b01f8e07259814e4e73b040ffa9836de89f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 24 Oct 2000 21:33:52 +0000 Subject: [PATCH] Check for SIGHUP and process config file updates just after waiting for input, not just before. --- src/backend/postmaster/postmaster.c | 66 ++++++++++++++--------------- src/backend/tcop/postgres.c | 27 ++++++------ 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 5276b6dcf1..e752d5e887 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -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; diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 04a7abb002..d4c37c91a0 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -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