Marginal performance improvement in LockBuffer --- calculate address

of BufferLocks[] entry just once.  Seems to save 10% or so of the
routine's runtime, which'd not be worth worrying about if it weren't
such a hotspot.
This commit is contained in:
Tom Lane 2000-03-14 22:46:27 +00:00
parent e02cde4b0a
commit c40a0a1b52
1 changed files with 19 additions and 17 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.75 2000/02/21 18:49:00 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.76 2000/03/14 22:46:27 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -2072,12 +2072,14 @@ void
LockBuffer(Buffer buffer, int mode) LockBuffer(Buffer buffer, int mode)
{ {
BufferDesc *buf; BufferDesc *buf;
bits8 *buflock;
Assert(BufferIsValid(buffer)); Assert(BufferIsValid(buffer));
if (BufferIsLocal(buffer)) if (BufferIsLocal(buffer))
return; return;
buf = &(BufferDescriptors[buffer - 1]); buf = &(BufferDescriptors[buffer - 1]);
buflock = &(BufferLocks[buffer - 1]);
#ifdef HAS_TEST_AND_SET #ifdef HAS_TEST_AND_SET
S_LOCK(&(buf->cntx_lock)); S_LOCK(&(buf->cntx_lock));
@ -2087,21 +2089,21 @@ LockBuffer(Buffer buffer, int mode)
if (mode == BUFFER_LOCK_UNLOCK) if (mode == BUFFER_LOCK_UNLOCK)
{ {
if (BufferLocks[buffer - 1] & BL_R_LOCK) if (*buflock & BL_R_LOCK)
{ {
Assert(buf->r_locks > 0); Assert(buf->r_locks > 0);
Assert(!(buf->w_lock)); Assert(!(buf->w_lock));
Assert(!(BufferLocks[buffer - 1] & (BL_W_LOCK | BL_RI_LOCK))) Assert(!(*buflock & (BL_W_LOCK | BL_RI_LOCK)));
(buf->r_locks)--; (buf->r_locks)--;
BufferLocks[buffer - 1] &= ~BL_R_LOCK; *buflock &= ~BL_R_LOCK;
} }
else if (BufferLocks[buffer - 1] & BL_W_LOCK) else if (*buflock & BL_W_LOCK)
{ {
Assert(buf->w_lock); Assert(buf->w_lock);
Assert(buf->r_locks == 0); Assert(buf->r_locks == 0);
Assert(!(BufferLocks[buffer - 1] & (BL_R_LOCK | BL_RI_LOCK))) Assert(!(*buflock & (BL_R_LOCK | BL_RI_LOCK)));
buf->w_lock = false; buf->w_lock = false;
BufferLocks[buffer - 1] &= ~BL_W_LOCK; *buflock &= ~BL_W_LOCK;
} }
else else
elog(ERROR, "UNLockBuffer: buffer %lu is not locked", buffer); elog(ERROR, "UNLockBuffer: buffer %lu is not locked", buffer);
@ -2110,7 +2112,7 @@ LockBuffer(Buffer buffer, int mode)
{ {
unsigned i = 0; unsigned i = 0;
Assert(!(BufferLocks[buffer - 1] & (BL_R_LOCK | BL_W_LOCK | BL_RI_LOCK))); Assert(!(*buflock & (BL_R_LOCK | BL_W_LOCK | BL_RI_LOCK)));
while (buf->ri_lock || buf->w_lock) while (buf->ri_lock || buf->w_lock)
{ {
#ifdef HAS_TEST_AND_SET #ifdef HAS_TEST_AND_SET
@ -2124,16 +2126,16 @@ LockBuffer(Buffer buffer, int mode)
#endif #endif
} }
(buf->r_locks)++; (buf->r_locks)++;
BufferLocks[buffer - 1] |= BL_R_LOCK; *buflock |= BL_R_LOCK;
} }
else if (mode == BUFFER_LOCK_EXCLUSIVE) else if (mode == BUFFER_LOCK_EXCLUSIVE)
{ {
unsigned i = 0; unsigned i = 0;
Assert(!(BufferLocks[buffer - 1] & (BL_R_LOCK | BL_W_LOCK | BL_RI_LOCK))); Assert(!(*buflock & (BL_R_LOCK | BL_W_LOCK | BL_RI_LOCK)));
while (buf->r_locks > 0 || buf->w_lock) while (buf->r_locks > 0 || buf->w_lock)
{ {
if (buf->r_locks > 3 || (BufferLocks[buffer - 1] & BL_RI_LOCK)) if (buf->r_locks > 3 || (*buflock & BL_RI_LOCK))
{ {
/* /*
* Our RI lock might be removed by concurrent W lock * Our RI lock might be removed by concurrent W lock
@ -2141,7 +2143,7 @@ LockBuffer(Buffer buffer, int mode)
* when our own W acquiring succeeded) and so * when our own W acquiring succeeded) and so
* we set RI lock again if we already did this. * we set RI lock again if we already did this.
*/ */
BufferLocks[buffer - 1] |= BL_RI_LOCK; *buflock |= BL_RI_LOCK;
buf->ri_lock = true; buf->ri_lock = true;
} }
#ifdef HAS_TEST_AND_SET #ifdef HAS_TEST_AND_SET
@ -2155,15 +2157,15 @@ LockBuffer(Buffer buffer, int mode)
#endif #endif
} }
buf->w_lock = true; buf->w_lock = true;
BufferLocks[buffer - 1] |= BL_W_LOCK; *buflock |= BL_W_LOCK;
if (BufferLocks[buffer - 1] & BL_RI_LOCK) if (*buflock & BL_RI_LOCK)
{ {
/* /*
* It's possible to remove RI locks acquired by another * It's possible to remove RI locks acquired by another
* W lockers here, but they'll take care about it. * W lockers here, but they'll take care about it.
*/ */
buf->ri_lock = false; buf->ri_lock = false;
BufferLocks[buffer - 1] &= ~BL_RI_LOCK; *buflock &= ~BL_RI_LOCK;
} }
} }
else else