aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/buffer/bufmgr.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-10-16 18:05:07 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-10-16 18:05:07 +0000
commit1c2de4774620469375e6393fbdbcdaffb0c2d0b5 (patch)
tree64865055e4b11e6633293d6efe342c7edcd86c46 /src/backend/storage/buffer/bufmgr.c
parent72f9013741833ddbecdbb46930bf0f62e4176803 (diff)
downloadpostgresql-1c2de4774620469375e6393fbdbcdaffb0c2d0b5.tar.gz
postgresql-1c2de4774620469375e6393fbdbcdaffb0c2d0b5.zip
Remove BufferLocks[] array in favor of a single pointer to the buffer
(if any) currently waited for by LockBufferForCleanup(), which is all that we were using it for anymore. Saves some space and eliminates proportional-to-NBuffers slowdown in UnlockBuffers().
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r--src/backend/storage/buffer/bufmgr.c68
1 files changed, 31 insertions, 37 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index a0f2bf9c117..a8cf506688f 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.178 2004/10/15 22:39:59 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.179 2004/10/16 18:05:06 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -66,6 +66,13 @@ long NDirectFileRead; /* some I/O's are direct file access.
long NDirectFileWrite; /* e.g., I/O in psort and hashjoin. */
+/* local state for StartBufferIO and related functions */
+static BufferDesc *InProgressBuf = NULL;
+static bool IsForInput;
+/* local state for LockBufferForCleanup */
+static BufferDesc *PinCountWaitBuf = NULL;
+
+
static void PinBuffer(BufferDesc *buf, bool fixOwner);
static void UnpinBuffer(BufferDesc *buf, bool fixOwner);
static void WaitIO(BufferDesc *buf);
@@ -1650,48 +1657,38 @@ SetBufferCommitInfoNeedsSave(Buffer buffer)
* Release buffer context locks for shared buffers.
*
* Used to clean up after errors.
+ *
+ * Currently, we can expect that lwlock.c's LWLockReleaseAll() took care
+ * of releasing buffer context locks per se; the only thing we need to deal
+ * with here is clearing any PIN_COUNT request that was in progress.
*/
void
UnlockBuffers(void)
{
- BufferDesc *buf;
- int i;
+ BufferDesc *buf = PinCountWaitBuf;
- for (i = 0; i < NBuffers; i++)
+ if (buf)
{
- bits8 buflocks = BufferLocks[i];
-
- if (buflocks == 0)
- continue;
-
- buf = &(BufferDescriptors[i]);
-
HOLD_INTERRUPTS(); /* don't want to die() partway through... */
+ LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
+
/*
- * The buffer's cntx_lock has already been released by lwlock.c.
+ * Don't complain if flag bit not set; it could have been
+ * reset but we got a cancel/die interrupt before getting the
+ * signal.
*/
+ if ((buf->flags & BM_PIN_COUNT_WAITER) != 0 &&
+ buf->wait_backend_id == MyBackendId)
+ buf->flags &= ~BM_PIN_COUNT_WAITER;
+ LWLockRelease(BufMgrLock);
- if (buflocks & BL_PIN_COUNT_LOCK)
- {
- LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
-
- /*
- * Don't complain if flag bit not set; it could have been
- * reset but we got a cancel/die interrupt before getting the
- * signal.
- */
- if ((buf->flags & BM_PIN_COUNT_WAITER) != 0 &&
- buf->wait_backend_id == MyBackendId)
- buf->flags &= ~BM_PIN_COUNT_WAITER;
- LWLockRelease(BufMgrLock);
- ProcCancelWaitForSignal();
- }
-
- BufferLocks[i] = 0;
+ ProcCancelWaitForSignal();
RESUME_INTERRUPTS();
}
+
+ PinCountWaitBuf = NULL;
}
/*
@@ -1779,9 +1776,9 @@ void
LockBufferForCleanup(Buffer buffer)
{
BufferDesc *bufHdr;
- bits8 *buflock;
Assert(BufferIsValid(buffer));
+ Assert(PinCountWaitBuf == NULL);
if (BufferIsLocal(buffer))
{
@@ -1799,7 +1796,6 @@ LockBufferForCleanup(Buffer buffer)
PrivateRefCount[buffer - 1]);
bufHdr = &BufferDescriptors[buffer - 1];
- buflock = &(BufferLocks[buffer - 1]);
for (;;)
{
@@ -1822,12 +1818,12 @@ LockBufferForCleanup(Buffer buffer)
}
bufHdr->wait_backend_id = MyBackendId;
bufHdr->flags |= BM_PIN_COUNT_WAITER;
- *buflock |= BL_PIN_COUNT_LOCK;
+ PinCountWaitBuf = bufHdr;
LWLockRelease(BufMgrLock);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
/* Wait to be signaled by UnpinBuffer() */
ProcWaitForSignal();
- *buflock &= ~BL_PIN_COUNT_LOCK;
+ PinCountWaitBuf = NULL;
/* Loop back and try again */
}
}
@@ -1835,11 +1831,9 @@ LockBufferForCleanup(Buffer buffer)
/*
* Functions for IO error handling
*
- * Note : We assume that nested buffer IO never occur.
+ * Note: We assume that nested buffer IO never occurs.
* i.e at most one io_in_progress lock is held per proc.
-*/
-static BufferDesc *InProgressBuf = NULL;
-static bool IsForInput;
+ */
/*
* Function:StartBufferIO