Commit 139abc28 authored by Neil Conway's avatar Neil Conway

Make LocalRefCount and PrivateRefCount arrays of int32, rather than long.

This saves a small amount of per-backend memory for LP64 machines.
parent 2ff4e440
...@@ -8,7 +8,7 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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: ...@@ -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) ...@@ -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)", ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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", ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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; ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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; ...@@ -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 */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment