From da99cce7cd53de43f63560197c076538cf2982f7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 12 Feb 2004 20:07:26 +0000 Subject: [PATCH] Avoid delaying postmaster shutdown by up to 10 seconds on platforms where signals do not terminate sleep() delays. --- src/backend/storage/buffer/bufmgr.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index e7435b9534..d515a7a259 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; } }