From e6cba71503fa80948a050e7e0126e932855e92cc Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 11 Jun 2004 16:43:24 +0000
Subject: [PATCH] Add some code to Assert that when we release pin on a buffer,
 we are not holding the buffer's cntx_lock or io_in_progress_lock.  A recent
 report from Litao Wu makes me wonder whether it is ever possible for us to
 drop a buffer and forget to release its cntx_lock.  The Assert does not fire
 in the regression tests, but that proves little ...

---
 src/backend/storage/buffer/bufmgr.c |  7 ++++++-
 src/backend/storage/lmgr/lwlock.c   | 22 +++++++++++++++++++++-
 src/include/storage/lwlock.h        |  3 ++-
 3 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 400fbcf1ff7..da1998a0d50 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.169 2004/05/31 20:31:33 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.170 2004/06/11 16:43:23 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -611,7 +611,12 @@ UnpinBuffer(BufferDesc *buf)
 	Assert(PrivateRefCount[b] > 0);
 	PrivateRefCount[b]--;
 	if (PrivateRefCount[b] == 0)
+	{
 		buf->refcount--;
+		/* I'd better not still hold any locks on the buffer */
+		Assert(!LWLockHeldByMe(buf->cntx_lock));
+		Assert(!LWLockHeldByMe(buf->io_in_progress_lock));
+	}
 
 	if ((buf->flags & BM_PIN_COUNT_WAITER) != 0 &&
 		buf->refcount == 1)
diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c
index efb3ac4a90f..d1410d04a05 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
- *	  $PostgreSQL: pgsql/src/backend/storage/lmgr/lwlock.c,v 1.19 2003/12/20 17:31:21 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/lmgr/lwlock.c,v 1.20 2004/06/11 16:43:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -519,3 +519,23 @@ LWLockReleaseAll(void)
 		LWLockRelease(held_lwlocks[num_held_lwlocks - 1]);
 	}
 }
+
+
+/*
+ * LWLockHeldByMe - test whether my process currently holds a lock
+ *
+ * This is meant as debug support only.  We do not distinguish whether the
+ * lock is held shared or exclusive.
+ */
+bool
+LWLockHeldByMe(LWLockId lockid)
+{
+	int	i;
+
+	for (i = 0; i < num_held_lwlocks; i++)
+	{
+		if (held_lwlocks[i] == lockid)
+			return true;
+	}
+	return false;
+}
diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h
index e06d9a4bf77..b1f6fc95103 100644
--- a/src/include/storage/lwlock.h
+++ b/src/include/storage/lwlock.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/lwlock.h,v 1.11 2004/05/31 03:48:10 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/storage/lwlock.h,v 1.12 2004/06/11 16:43:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -62,6 +62,7 @@ extern void LWLockAcquire(LWLockId lockid, LWLockMode mode);
 extern bool LWLockConditionalAcquire(LWLockId lockid, LWLockMode mode);
 extern void LWLockRelease(LWLockId lockid);
 extern void LWLockReleaseAll(void);
+extern bool LWLockHeldByMe(LWLockId lockid);
 
 extern int	NumLWLocks(void);
 extern int	LWLockShmemSize(void);
-- 
GitLab