]> granicus.if.org Git - postgresql/commitdiff
On some platforms, pg_usleep isn't interruptible by signals; fix
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 7 Aug 2006 17:41:42 +0000 (17:41 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 7 Aug 2006 17:41:42 +0000 (17:41 +0000)
archiver to behave per original coder's expectation on these machines.
We already know this everywhere else AFAICT.

src/backend/postmaster/pgarch.c

index bcf1b2dcafb55493ef2fccaa1fc43927ef21fd5e..30845068207d12ceeb99262022ffb0095d907f79 100644 (file)
@@ -19,7 +19,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.24 2006/06/27 22:16:43 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.25 2006/08/07 17:41:42 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -286,7 +286,6 @@ static void
 pgarch_MainLoop(void)
 {
        time_t          last_copy_time = 0;
-       time_t          curtime;
 
        /*
         * We run the copy loop immediately upon entry, in case there are
@@ -298,7 +297,6 @@ pgarch_MainLoop(void)
 
        do
        {
-
                /* Check for config update */
                if (got_SIGHUP)
                {
@@ -318,15 +316,19 @@ pgarch_MainLoop(void)
 
                /*
                 * There shouldn't be anything for the archiver to do except to wait
-                * for a signal, ... however, the archiver exists to protect our data,
-                * so she wakes up occasionally to allow herself to be proactive. In
-                * particular this avoids getting stuck if a signal arrives just
-                * before we sleep.
+                * for a signal ... however, the archiver exists to protect our data,
+                * so she wakes up occasionally to allow herself to be proactive.
+                *
+                * On some platforms, signals won't interrupt the sleep.  To ensure we
+                * respond reasonably promptly when someone signals us, break down the
+                * sleep into 1-second increments, and check for interrupts after each
+                * nap.
                 */
-               if (!wakened)
+               while (!(wakened || got_SIGHUP))
                {
-                       pg_usleep(PGARCH_AUTOWAKE_INTERVAL * 1000000L);
+                       time_t          curtime;
 
+                       pg_usleep(1000000L);
                        curtime = time(NULL);
                        if ((unsigned int) (curtime - last_copy_time) >=
                                (unsigned int) PGARCH_AUTOWAKE_INTERVAL)