diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index b22631700b461206702b47eb41ff5ca7677d5dca..4df563b4285a51f2d7f1e71196504c97b756c8d5 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.142 2002/09/22 19:42:50 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.143 2002/09/25 20:31:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -369,6 +369,9 @@ BootstrapMain(int argc, char *argv[])
 
 	BaseInit();
 
+	if (IsUnderPostmaster)
+		InitDummyProcess();		/* needed to get LWLocks */
+
 	/*
 	 * XLOG operations
 	 */
@@ -386,8 +389,6 @@ BootstrapMain(int argc, char *argv[])
 			break;
 
 		case BS_XLOG_CHECKPOINT:
-			if (IsUnderPostmaster)
-				InitDummyProcess();		/* needed to get LWLocks */
 			CreateDummyCaches();
 			CreateCheckPoint(false);
 			SetSavedRedoRecPtr();		/* pass redo ptr back to
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 50580a8ee10420999c9c58775782e69a49939012..9c7795cd26e1b2c99892d8e95a26c87295a83cdb 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -16,7 +16,7 @@
  *
  *	Copyright (c) 2001, PostgreSQL Global Development Group
  *
- *	$Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.28 2002/09/05 18:26:18 petere Exp $
+ *	$Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.29 2002/09/25 20:31:40 tgl Exp $
  * ----------
  */
 #include "postgres.h"
@@ -314,6 +314,8 @@ pgstat_start(void)
 
 	IsUnderPostmaster = true;	/* we are a postmaster subprocess now */
 
+	MyProcPid = getpid();		/* reset MyProcPid */
+
 	/* Lose the postmaster's on-exit routines */
 	on_exit_reset();
 
@@ -1190,6 +1192,8 @@ pgstat_main(void)
 	 */
 	pqsignal(SIGCHLD, SIG_DFL);
 
+	MyProcPid = getpid();		/* reset MyProcPid */
+
 	/*
 	 * Identify myself via ps
 	 */
diff --git a/src/backend/storage/buffer/buf_init.c b/src/backend/storage/buffer/buf_init.c
index dd6478c195d085839c57f0dc0836acca106d4686..3d25381c14d8d450a75f29e788c7811949293e11 100644
--- a/src/backend/storage/buffer/buf_init.c
+++ b/src/backend/storage/buffer/buf_init.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/buffer/buf_init.c,v 1.52 2002/09/04 20:31:25 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/buffer/buf_init.c,v 1.53 2002/09/25 20:31:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -35,8 +35,6 @@
 #include "utils/memutils.h"
 
 
-static void ShutdownBufferPoolAccess(void);
-
 /*
  *	if BMTRACE is defined, we trace the last 200 buffer allocations and
  *	deallocations in a circular buffer in shared memory.
@@ -219,6 +217,10 @@ InitBufferPool(void)
  * This is called during backend startup (whether standalone or under the
  * postmaster).  It sets up for this backend's access to the already-existing
  * buffer pool.
+ *
+ * NB: this is called before InitProcess(), so we do not have a PGPROC and
+ * cannot do LWLockAcquire; hence we can't actually access the bufmgr's
+ * shared memory yet.  We are only initializing local data here.
  */
 void
 InitBufferPoolAccess(void)
@@ -238,27 +240,6 @@ InitBufferPoolAccess(void)
 	 */
 	for (i = 0; i < NBuffers; i++)
 		BufferBlockPointers[i] = (Block) MAKE_PTR(BufferDescriptors[i].data);
-
-	/*
-	 * Now that buffer access is initialized, set up a callback to shut it
-	 * down again at backend exit.
-	 */
-	on_shmem_exit(ShutdownBufferPoolAccess, 0);
-}
-
-/*
- * Shut down buffer manager at backend exit.
- *
- * This is needed mainly to ensure that we don't leave any buffer reference
- * counts set during an error exit.
- */
-static void
-ShutdownBufferPoolAccess(void)
-{
-	/* Release any buffer context locks we are holding */
-	UnlockBuffers();
-	/* Release any buffer reference counts we are holding */
-	AtEOXact_Buffers(false);
 }
 
 /* -----------------------------------------------------
diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c
index e2559be0e6f709381242390dbfffac53994d1174..8eaf752183056c8c7fce0889dbc3a220d0e8b0ae 100644
--- a/src/backend/storage/lmgr/lwlock.c
+++ b/src/backend/storage/lmgr/lwlock.c
@@ -15,7 +15,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lwlock.c,v 1.13 2002/09/04 20:31:26 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lwlock.c,v 1.14 2002/09/25 20:31:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -203,6 +203,13 @@ LWLockAcquire(LWLockId lockid, LWLockMode mode)
 
 	PRINT_LWDEBUG("LWLockAcquire", lockid, lock);
 
+	/*
+	 * We can't wait if we haven't got a PGPROC.  This should only occur
+	 * during bootstrap or shared memory initialization.  Put an Assert
+	 * here to catch unsafe coding practices.
+	 */
+	Assert(!(proc == NULL && IsUnderPostmaster));
+
 	/*
 	 * Lock out cancel/die interrupts until we exit the code section
 	 * protected by the LWLock.  This ensures that interrupts will not
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index 5dceb721abd6986a669a0c8fd0718248a677990d..04f57707d1933998392832a601110b653c29821b 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.125 2002/09/04 20:31:26 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.126 2002/09/25 20:31:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -391,8 +391,15 @@ ProcKill(void)
 	/* Release any LW locks I am holding */
 	LWLockReleaseAll();
 
-	/* Abort any buffer I/O in progress */
+	/*
+	 * Make real sure we release any buffer locks and pins we might be
+	 * holding, too.  It is pretty ugly to do this here and not in a
+	 * shutdown callback registered by the bufmgr ... but we must do this
+	 * *after* LWLockReleaseAll and *before* zapping MyProc.
+	 */
 	AbortBufferIO();
+	UnlockBuffers();
+	AtEOXact_Buffers(false);
 
 	/* Get off any wait queue I might be on */
 	LockWaitCancel();
@@ -430,8 +437,10 @@ DummyProcKill(void)
 	/* Release any LW locks I am holding */
 	LWLockReleaseAll();
 
-	/* Abort any buffer I/O in progress */
+	/* Release buffer locks and pins, too */
 	AbortBufferIO();
+	UnlockBuffers();
+	AtEOXact_Buffers(false);
 
 	/* I can't be on regular lock queues, so needn't check */
 
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 0b713f25a4850506aaa5196143db83e8f8bc32fa..6b49bdba6c5f7e2e05a79bed41f80282f991a55a 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.293 2002/09/20 03:45:08 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.294 2002/09/25 20:31:40 tgl Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -1163,6 +1163,13 @@ PostgresMain(int argc, char *argv[], const char *username)
 		}
 	}
 
+	/*
+	 * initialize globals (already done if under postmaster, but not if
+	 * standalone; cheap enough to do over)
+	 */
+
+	MyProcPid = getpid();
+
 	/*
 	 * Fire up essential subsystems: error and memory management
 	 *
@@ -1691,7 +1698,7 @@ PostgresMain(int argc, char *argv[], const char *username)
 	if (!IsUnderPostmaster)
 	{
 		puts("\nPOSTGRES backend interactive interface ");
-		puts("$Revision: 1.293 $ $Date: 2002/09/20 03:45:08 $\n");
+		puts("$Revision: 1.294 $ $Date: 2002/09/25 20:31:40 $\n");
 	}
 
 	/*