aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/buffer/bufmgr.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-02-12 20:07:26 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-02-12 20:07:26 +0000
commitda99cce7cd53de43f63560197c076538cf2982f7 (patch)
tree960a3095309de95cb14620f892366198fa132643 /src/backend/storage/buffer/bufmgr.c
parent4a1c29f87e7e21c1e2cb97fdc48558975ed01f46 (diff)
downloadpostgresql-da99cce7cd53de43f63560197c076538cf2982f7.tar.gz
postgresql-da99cce7cd53de43f63560197c076538cf2982f7.zip
Avoid delaying postmaster shutdown by up to 10 seconds on platforms
where signals do not terminate sleep() delays.
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r--src/backend/storage/buffer/bufmgr.c20
1 files changed, 18 insertions, 2 deletions
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;
}
}