mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Make LocalRefCount and PrivateRefCount arrays of int32, rather than long.
This saves a small amount of per-backend memory for LP64 machines.
This commit is contained in:
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/storage/buffer/buf_init.c,v 1.64 2004/04/21 18:06:30 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/storage/buffer/buf_init.c,v 1.65 2004/04/22 07:21:55 neilc Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -21,7 +21,7 @@
|
|||||||
BufferDesc *BufferDescriptors;
|
BufferDesc *BufferDescriptors;
|
||||||
Block *BufferBlockPointers;
|
Block *BufferBlockPointers;
|
||||||
|
|
||||||
long *PrivateRefCount; /* also used in freelist.c */
|
int32 *PrivateRefCount; /* also used in freelist.c */
|
||||||
bits8 *BufferLocks; /* flag bits showing locks I have set */
|
bits8 *BufferLocks; /* flag bits showing locks I have set */
|
||||||
|
|
||||||
/* statistics counters */
|
/* statistics counters */
|
||||||
@ -176,9 +176,11 @@ InitBufferPoolAccess(void)
|
|||||||
/*
|
/*
|
||||||
* Allocate and zero local arrays of per-buffer info.
|
* Allocate and zero local arrays of per-buffer info.
|
||||||
*/
|
*/
|
||||||
BufferBlockPointers = (Block *) calloc(NBuffers, sizeof(Block));
|
BufferBlockPointers = (Block *) calloc(NBuffers,
|
||||||
PrivateRefCount = (long *) calloc(NBuffers, sizeof(long));
|
sizeof(*BufferBlockPointers));
|
||||||
BufferLocks = (bits8 *) calloc(NBuffers, sizeof(bits8));
|
PrivateRefCount = (int32 *) calloc(NBuffers,
|
||||||
|
sizeof(*PrivateRefCount));
|
||||||
|
BufferLocks = (bits8 *) calloc(NBuffers, sizeof(*BufferLocks));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert shmem offsets into addresses as seen by this process. This
|
* Convert shmem offsets into addresses as seen by this process. This
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.162 2004/04/21 18:06:30 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.163 2004/04/22 07:21:55 neilc Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -59,7 +59,7 @@
|
|||||||
bool zero_damaged_pages = false;
|
bool zero_damaged_pages = false;
|
||||||
|
|
||||||
#ifdef NOT_USED
|
#ifdef NOT_USED
|
||||||
int ShowPinTrace = 0;
|
bool ShowPinTrace = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int BgWriterDelay = 200;
|
int BgWriterDelay = 200;
|
||||||
@ -843,7 +843,7 @@ AtEOXact_Buffers(bool isCommit)
|
|||||||
if (isCommit)
|
if (isCommit)
|
||||||
elog(WARNING,
|
elog(WARNING,
|
||||||
"buffer refcount leak: [%03d] "
|
"buffer refcount leak: [%03d] "
|
||||||
"(rel=%u/%u, blockNum=%u, flags=0x%x, refcount=%d %ld)",
|
"(rel=%u/%u, blockNum=%u, flags=0x%x, refcount=%u %d)",
|
||||||
i,
|
i,
|
||||||
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum, buf->flags,
|
buf->tag.blockNum, buf->flags,
|
||||||
@ -1225,7 +1225,7 @@ recheck:
|
|||||||
{
|
{
|
||||||
/* the sole pin should be ours */
|
/* the sole pin should be ours */
|
||||||
if (bufHdr->refcount != 1 || PrivateRefCount[i - 1] == 0)
|
if (bufHdr->refcount != 1 || PrivateRefCount[i - 1] == 0)
|
||||||
elog(FATAL, "block %u of %u/%u is still referenced (private %ld, global %d)",
|
elog(FATAL, "block %u of %u/%u is still referenced (private %d, global %u)",
|
||||||
bufHdr->tag.blockNum,
|
bufHdr->tag.blockNum,
|
||||||
bufHdr->tag.rnode.tblNode,
|
bufHdr->tag.rnode.tblNode,
|
||||||
bufHdr->tag.rnode.relNode,
|
bufHdr->tag.rnode.relNode,
|
||||||
@ -1330,8 +1330,9 @@ PrintBufferDescs(void)
|
|||||||
LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
|
LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);
|
||||||
for (i = 0; i < NBuffers; ++i, ++buf)
|
for (i = 0; i < NBuffers; ++i, ++buf)
|
||||||
{
|
{
|
||||||
elog(LOG, "[%02d] (freeNext=%d, freePrev=%d, rel=%u/%u, \
|
elog(LOG,
|
||||||
blockNum=%u, flags=0x%x, refcount=%d %ld)",
|
"[%02d] (freeNext=%d, freePrev=%d, rel=%u/%u, "
|
||||||
|
"blockNum=%u, flags=0x%x, refcount=%u %d)",
|
||||||
i, buf->freeNext, buf->freePrev,
|
i, buf->freeNext, buf->freePrev,
|
||||||
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum, buf->flags,
|
buf->tag.blockNum, buf->flags,
|
||||||
@ -1344,7 +1345,7 @@ blockNum=%u, flags=0x%x, refcount=%d %ld)",
|
|||||||
/* interactive backend */
|
/* interactive backend */
|
||||||
for (i = 0; i < NBuffers; ++i, ++buf)
|
for (i = 0; i < NBuffers; ++i, ++buf)
|
||||||
{
|
{
|
||||||
printf("[%-2d] (%u/%u, %u) flags=0x%x, refcnt=%d %ld)\n",
|
printf("[%-2d] (%u/%u, %u) flags=0x%x, refcount=%u %d)\n",
|
||||||
i, buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
i, buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum,
|
buf->tag.blockNum,
|
||||||
buf->flags, buf->refcount, PrivateRefCount[i]);
|
buf->flags, buf->refcount, PrivateRefCount[i]);
|
||||||
@ -1364,8 +1365,9 @@ PrintPinnedBufs(void)
|
|||||||
for (i = 0; i < NBuffers; ++i, ++buf)
|
for (i = 0; i < NBuffers; ++i, ++buf)
|
||||||
{
|
{
|
||||||
if (PrivateRefCount[i] > 0)
|
if (PrivateRefCount[i] > 0)
|
||||||
elog(WARNING, "[%02d] (freeNext=%d, freePrev=%d, rel=%u/%u, \
|
elog(WARNING,
|
||||||
blockNum=%u, flags=0x%x, refcount=%d %ld)",
|
"[%02d] (freeNext=%d, freePrev=%d, rel=%u/%u, "
|
||||||
|
"blockNum=%u, flags=0x%x, refcount=%u %d)",
|
||||||
i, buf->freeNext, buf->freePrev,
|
i, buf->freeNext, buf->freePrev,
|
||||||
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum, buf->flags,
|
buf->tag.blockNum, buf->flags,
|
||||||
@ -1458,7 +1460,7 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
|
|||||||
}
|
}
|
||||||
if (LocalRefCount[i] > 0)
|
if (LocalRefCount[i] > 0)
|
||||||
{
|
{
|
||||||
elog(WARNING, "FlushRelationBuffers(\"%s\" (local), %u): block %u is referenced (%ld)",
|
elog(WARNING, "FlushRelationBuffers(\"%s\" (local), %u): block %u is referenced (%d)",
|
||||||
RelationGetRelationName(rel), firstDelBlock,
|
RelationGetRelationName(rel), firstDelBlock,
|
||||||
bufHdr->tag.blockNum, LocalRefCount[i]);
|
bufHdr->tag.blockNum, LocalRefCount[i]);
|
||||||
return (-2);
|
return (-2);
|
||||||
@ -1507,7 +1509,7 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
|
|||||||
if (bufHdr->refcount != 0)
|
if (bufHdr->refcount != 0)
|
||||||
{
|
{
|
||||||
LWLockRelease(BufMgrLock);
|
LWLockRelease(BufMgrLock);
|
||||||
elog(WARNING, "FlushRelationBuffers(\"%s\", %u): block %u is referenced (private %ld, global %d)",
|
elog(WARNING, "FlushRelationBuffers(\"%s\", %u): block %u is referenced (private %d, global %u)",
|
||||||
RelationGetRelationName(rel), firstDelBlock,
|
RelationGetRelationName(rel), firstDelBlock,
|
||||||
bufHdr->tag.blockNum,
|
bufHdr->tag.blockNum,
|
||||||
PrivateRefCount[i], bufHdr->refcount);
|
PrivateRefCount[i], bufHdr->refcount);
|
||||||
@ -1565,8 +1567,9 @@ IncrBufferRefCount_Debug(char *file, int line, Buffer buffer)
|
|||||||
{
|
{
|
||||||
BufferDesc *buf = &BufferDescriptors[buffer - 1];
|
BufferDesc *buf = &BufferDescriptors[buffer - 1];
|
||||||
|
|
||||||
fprintf(stderr, "PIN(Incr) %d rel = %u/%u, blockNum = %u, \
|
fprintf(stderr,
|
||||||
refcount = %ld, file: %s, line: %d\n",
|
"PIN(Incr) %d rel = %u/%u, blockNum = %u, "
|
||||||
|
"refcount = %d, file: %s, line: %d\n",
|
||||||
buffer,
|
buffer,
|
||||||
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum,
|
buf->tag.blockNum,
|
||||||
@ -1584,8 +1587,9 @@ ReleaseBuffer_Debug(char *file, int line, Buffer buffer)
|
|||||||
{
|
{
|
||||||
BufferDesc *buf = &BufferDescriptors[buffer - 1];
|
BufferDesc *buf = &BufferDescriptors[buffer - 1];
|
||||||
|
|
||||||
fprintf(stderr, "UNPIN(Rel) %d rel = %u/%u, blockNum = %u, \
|
fprintf(stderr,
|
||||||
refcount = %ld, file: %s, line: %d\n",
|
"UNPIN(Rel) %d rel = %u/%u, blockNum = %u, "
|
||||||
|
"refcount = %d, file: %s, line: %d\n",
|
||||||
buffer,
|
buffer,
|
||||||
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum,
|
buf->tag.blockNum,
|
||||||
@ -1612,8 +1616,9 @@ ReleaseAndReadBuffer_Debug(char *file,
|
|||||||
{
|
{
|
||||||
BufferDesc *buf = &BufferDescriptors[buffer - 1];
|
BufferDesc *buf = &BufferDescriptors[buffer - 1];
|
||||||
|
|
||||||
fprintf(stderr, "UNPIN(Rel&Rd) %d rel = %u/%u, blockNum = %u, \
|
fprintf(stderr,
|
||||||
refcount = %ld, file: %s, line: %d\n",
|
"UNPIN(Rel&Rd) %d rel = %u/%u, blockNum = %u, "
|
||||||
|
"refcount = %d, file: %s, line: %d\n",
|
||||||
buffer,
|
buffer,
|
||||||
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum,
|
buf->tag.blockNum,
|
||||||
@ -1623,8 +1628,9 @@ refcount = %ld, file: %s, line: %d\n",
|
|||||||
{
|
{
|
||||||
BufferDesc *buf = &BufferDescriptors[b - 1];
|
BufferDesc *buf = &BufferDescriptors[b - 1];
|
||||||
|
|
||||||
fprintf(stderr, "PIN(Rel&Rd) %d rel = %u/%u, blockNum = %u, \
|
fprintf(stderr,
|
||||||
refcount = %ld, file: %s, line: %d\n",
|
"PIN(Rel&Rd) %d rel = %u/%u, blockNum = %u, "
|
||||||
|
"refcount = %d, file: %s, line: %d\n",
|
||||||
b,
|
b,
|
||||||
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum,
|
buf->tag.blockNum,
|
||||||
@ -1819,7 +1825,7 @@ LockBufferForCleanup(Buffer buffer)
|
|||||||
{
|
{
|
||||||
/* There should be exactly one pin */
|
/* There should be exactly one pin */
|
||||||
if (LocalRefCount[-buffer - 1] != 1)
|
if (LocalRefCount[-buffer - 1] != 1)
|
||||||
elog(ERROR, "incorrect local pin count: %ld",
|
elog(ERROR, "incorrect local pin count: %d",
|
||||||
LocalRefCount[-buffer - 1]);
|
LocalRefCount[-buffer - 1]);
|
||||||
/* Nobody else to wait for */
|
/* Nobody else to wait for */
|
||||||
return;
|
return;
|
||||||
@ -1827,7 +1833,7 @@ LockBufferForCleanup(Buffer buffer)
|
|||||||
|
|
||||||
/* There should be exactly one local pin */
|
/* There should be exactly one local pin */
|
||||||
if (PrivateRefCount[buffer - 1] != 1)
|
if (PrivateRefCount[buffer - 1] != 1)
|
||||||
elog(ERROR, "incorrect local pin count: %ld",
|
elog(ERROR, "incorrect local pin count: %d",
|
||||||
PrivateRefCount[buffer - 1]);
|
PrivateRefCount[buffer - 1]);
|
||||||
|
|
||||||
bufHdr = &BufferDescriptors[buffer - 1];
|
bufHdr = &BufferDescriptors[buffer - 1];
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.53 2004/04/21 18:06:30 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.54 2004/04/22 07:21:55 neilc Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -28,7 +28,7 @@ int NLocBuffer = 64;
|
|||||||
|
|
||||||
BufferDesc *LocalBufferDescriptors = NULL;
|
BufferDesc *LocalBufferDescriptors = NULL;
|
||||||
Block *LocalBufferBlockPointers = NULL;
|
Block *LocalBufferBlockPointers = NULL;
|
||||||
long *LocalRefCount = NULL;
|
int32 *LocalRefCount = NULL;
|
||||||
|
|
||||||
static int nextFreeLocalBuf = 0;
|
static int nextFreeLocalBuf = 0;
|
||||||
|
|
||||||
@ -195,10 +195,12 @@ InitLocalBuffer(void)
|
|||||||
/*
|
/*
|
||||||
* these aren't going away. I'm not gonna use palloc.
|
* these aren't going away. I'm not gonna use palloc.
|
||||||
*/
|
*/
|
||||||
LocalBufferDescriptors =
|
LocalBufferDescriptors = (BufferDesc *)
|
||||||
(BufferDesc *) calloc(NLocBuffer, sizeof(BufferDesc));
|
calloc(NLocBuffer, sizeof(*LocalBufferDescriptors));
|
||||||
LocalBufferBlockPointers = (Block *) calloc(NLocBuffer, sizeof(Block));
|
LocalBufferBlockPointers = (Block *)
|
||||||
LocalRefCount = (long *) calloc(NLocBuffer, sizeof(long));
|
calloc(NLocBuffer, sizeof(*LocalBufferBlockPointers));
|
||||||
|
LocalRefCount = (int32 *)
|
||||||
|
calloc(NLocBuffer, sizeof(*LocalRefCount));
|
||||||
nextFreeLocalBuf = 0;
|
nextFreeLocalBuf = 0;
|
||||||
|
|
||||||
for (i = 0; i < NLocBuffer; i++)
|
for (i = 0; i < NLocBuffer; i++)
|
||||||
@ -233,7 +235,7 @@ AtEOXact_LocalBuffers(bool isCommit)
|
|||||||
|
|
||||||
if (isCommit)
|
if (isCommit)
|
||||||
elog(WARNING,
|
elog(WARNING,
|
||||||
"local buffer leak: [%03d] (rel=%u/%u, blockNum=%u, flags=0x%x, refcount=%d %ld)",
|
"local buffer leak: [%03d] (rel=%u/%u, blockNum=%u, flags=0x%x, refcount=%u %d)",
|
||||||
i,
|
i,
|
||||||
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
buf->tag.rnode.tblNode, buf->tag.rnode.relNode,
|
||||||
buf->tag.blockNum, buf->flags,
|
buf->tag.blockNum, buf->flags,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.76 2004/04/21 18:06:30 tgl Exp $
|
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.77 2004/04/22 07:21:55 neilc Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -35,12 +35,12 @@ extern int BgWriterMaxpages;
|
|||||||
|
|
||||||
/* in buf_init.c */
|
/* in buf_init.c */
|
||||||
extern DLLIMPORT Block *BufferBlockPointers;
|
extern DLLIMPORT Block *BufferBlockPointers;
|
||||||
extern long *PrivateRefCount;
|
extern int32 *PrivateRefCount;
|
||||||
|
|
||||||
/* in localbuf.c */
|
/* in localbuf.c */
|
||||||
extern DLLIMPORT int NLocBuffer;
|
extern DLLIMPORT int NLocBuffer;
|
||||||
extern DLLIMPORT Block *LocalBufferBlockPointers;
|
extern DLLIMPORT Block *LocalBufferBlockPointers;
|
||||||
extern long *LocalRefCount;
|
extern int32 *LocalRefCount;
|
||||||
|
|
||||||
/* special pageno for bget */
|
/* special pageno for bget */
|
||||||
#define P_NEW InvalidBlockNumber /* grow the file to get a new page */
|
#define P_NEW InvalidBlockNumber /* grow the file to get a new page */
|
||||||
|
Reference in New Issue
Block a user