From a70ccfc6de412d7ec8517594ece0777c837c375b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 12 Aug 2005 05:05:51 +0000 Subject: [PATCH] Remove BufferBlockPointers array in favor of a base + (bufnum) * BLCKSZ computation. On modern machines this is as fast if not faster, and we don't have to clog the CPU's L2 cache with a tens-of-KB pointer array. If we ever decide to adopt a more dynamic allocation method for shared buffers, we'll probably have to revert this patch, but in the meantime we might as well save a few bytes and nanoseconds. Per Qingqing Zhou. --- src/backend/storage/buffer/buf_init.c | 23 +---------------------- src/backend/storage/buffer/bufmgr.c | 2 +- src/include/storage/bufmgr.h | 4 ++-- 3 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/backend/storage/buffer/buf_init.c b/src/backend/storage/buffer/buf_init.c index 9d3c2e44ff..ed38f8d874 100644 --- a/src/backend/storage/buffer/buf_init.c +++ b/src/backend/storage/buffer/buf_init.c @@ -19,11 +19,9 @@ BufferDesc *BufferDescriptors; -Block *BufferBlockPointers; +char *BufferBlocks; int32 *PrivateRefCount; -static char *BufferBlocks; - /* statistics counters */ long int ReadBufferCount; long int ReadLocalBufferCount; @@ -154,30 +152,11 @@ InitBufferPool(void) void InitBufferPoolAccess(void) { - char *block; - int i; - /* * Allocate and zero local arrays of per-buffer info. */ - BufferBlockPointers = (Block *) calloc(NBuffers, - sizeof(*BufferBlockPointers)); PrivateRefCount = (int32 *) calloc(NBuffers, sizeof(*PrivateRefCount)); - - /* - * Construct addresses for the individual buffer data blocks. We do - * this just to speed up the BufferGetBlock() macro. (Since the - * addresses should be the same in every backend, we could inherit - * this data from the postmaster --- but in the EXEC_BACKEND case - * that doesn't work.) - */ - block = BufferBlocks; - for (i = 0; i < NBuffers; i++) - { - BufferBlockPointers[i] = (Block) block; - block += BLCKSZ; - } } /* diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 65169c5386..af6cecbce3 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -54,7 +54,7 @@ /* Note: these two macros only work on shared buffers, not local ones! */ -#define BufHdrGetBlock(bufHdr) BufferBlockPointers[(bufHdr)->buf_id] +#define BufHdrGetBlock(bufHdr) ((Block) (BufferBlocks + ((Size) (bufHdr)->buf_id) * BLCKSZ)) #define BufferGetLSN(bufHdr) (*((XLogRecPtr*) BufHdrGetBlock(bufHdr))) /* Note: this macro only works on local buffers, not shared ones! */ diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index 9eea85bf9e..f0e169417c 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -33,7 +33,7 @@ extern int bgwriter_lru_maxpages; extern int bgwriter_all_maxpages; /* in buf_init.c */ -extern DLLIMPORT Block *BufferBlockPointers; +extern DLLIMPORT char *BufferBlocks; extern DLLIMPORT int32 *PrivateRefCount; /* in localbuf.c */ @@ -107,7 +107,7 @@ extern DLLIMPORT int32 *LocalRefCount; BufferIsLocal(buffer) ? \ LocalBufferBlockPointers[-(buffer) - 1] \ : \ - BufferBlockPointers[(buffer) - 1] \ + (Block) (BufferBlocks + ((Size) ((buffer) - 1)) * BLCKSZ) \ ) /* -- 2.39.5