diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index e7435b9534a..d515a7a2590 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.159 2004/02/12 15:06:56 wieck Exp $ + * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.160 2004/02/12 20:07:26 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -943,6 +943,7 @@ BufferBackgroundWriter(void) for (;;) { int n; + long udelay; /* * Call BufferSync() with instructions to keep just the @@ -970,8 +971,23 @@ BufferBackgroundWriter(void) /* * Nap for the configured time or sleep for 10 seconds if * there was nothing to do at all. + * + * On some platforms, signals won't interrupt the sleep. To ensure + * we respond reasonably promptly when the postmaster signals us, + * break down the sleep into 1-second increments, and check for + * interrupts after each nap. */ - pg_usleep((n > 0) ? BgWriterDelay * 1000L : 10000000L); + udelay = ((n > 0) ? BgWriterDelay : 10000) * 1000L; + while (udelay > 1000000L) + { + pg_usleep(1000000L); + udelay -= 1000000L; + if (InterruptPending) + return; + } + pg_usleep(udelay); + if (InterruptPending) + return; } }