mirror of
https://github.com/postgres/postgres.git
synced 2025-09-05 02:22:28 +03:00
bufmgr: Add Pin/UnpinLocalBuffer()
So far these were open-coded in quite a few places, without a good reason. Reviewed-by: Melanie Plageman <melanieplageman@gmail.com> Reviewed-by: David Rowley <dgrowleyml@gmail.com> Discussion: https://postgr.es/m/20221029025420.eplyow6k7tgu6he3@awork3.anarazel.de
This commit is contained in:
@@ -137,27 +137,8 @@ LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum,
|
||||
fprintf(stderr, "LB ALLOC (%u,%d,%d) %d\n",
|
||||
smgr->smgr_rlocator.locator.relNumber, forkNum, blockNum, -b - 1);
|
||||
#endif
|
||||
buf_state = pg_atomic_read_u32(&bufHdr->state);
|
||||
|
||||
/* this part is equivalent to PinBuffer for a shared buffer */
|
||||
if (LocalRefCount[b] == 0)
|
||||
{
|
||||
if (BUF_STATE_GET_USAGECOUNT(buf_state) < BM_MAX_USAGE_COUNT)
|
||||
{
|
||||
buf_state += BUF_USAGECOUNT_ONE;
|
||||
pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state);
|
||||
}
|
||||
}
|
||||
LocalRefCount[b]++;
|
||||
ResourceOwnerRememberBuffer(CurrentResourceOwner,
|
||||
BufferDescriptorGetBuffer(bufHdr));
|
||||
if (buf_state & BM_VALID)
|
||||
*foundPtr = true;
|
||||
else
|
||||
{
|
||||
/* Previous read attempt must have failed; try again */
|
||||
*foundPtr = false;
|
||||
}
|
||||
*foundPtr = PinLocalBuffer(bufHdr, true);
|
||||
return bufHdr;
|
||||
}
|
||||
|
||||
@@ -194,9 +175,7 @@ LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum,
|
||||
else
|
||||
{
|
||||
/* Found a usable buffer */
|
||||
LocalRefCount[b]++;
|
||||
ResourceOwnerRememberBuffer(CurrentResourceOwner,
|
||||
BufferDescriptorGetBuffer(bufHdr));
|
||||
PinLocalBuffer(bufHdr, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -484,6 +463,48 @@ InitLocalBuffers(void)
|
||||
NLocBuffer = nbufs;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX: We could have a slightly more efficient version of PinLocalBuffer()
|
||||
* that does not support adjusting the usagecount - but so far it does not
|
||||
* seem worth the trouble.
|
||||
*/
|
||||
bool
|
||||
PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount)
|
||||
{
|
||||
uint32 buf_state;
|
||||
Buffer buffer = BufferDescriptorGetBuffer(buf_hdr);
|
||||
int bufid = -buffer - 1;
|
||||
|
||||
buf_state = pg_atomic_read_u32(&buf_hdr->state);
|
||||
|
||||
if (LocalRefCount[bufid] == 0)
|
||||
{
|
||||
if (adjust_usagecount &&
|
||||
BUF_STATE_GET_USAGECOUNT(buf_state) < BM_MAX_USAGE_COUNT)
|
||||
{
|
||||
buf_state += BUF_USAGECOUNT_ONE;
|
||||
pg_atomic_unlocked_write_u32(&buf_hdr->state, buf_state);
|
||||
}
|
||||
}
|
||||
LocalRefCount[bufid]++;
|
||||
ResourceOwnerRememberBuffer(CurrentResourceOwner,
|
||||
BufferDescriptorGetBuffer(buf_hdr));
|
||||
|
||||
return buf_state & BM_VALID;
|
||||
}
|
||||
|
||||
void
|
||||
UnpinLocalBuffer(Buffer buffer)
|
||||
{
|
||||
int buffid = -buffer - 1;
|
||||
|
||||
Assert(BufferIsLocal(buffer));
|
||||
Assert(LocalRefCount[buffid] > 0);
|
||||
|
||||
ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer);
|
||||
LocalRefCount[buffid]--;
|
||||
}
|
||||
|
||||
/*
|
||||
* GUC check_hook for temp_buffers
|
||||
*/
|
||||
|
Reference in New Issue
Block a user