Remove BufferBlockPointers array in favor of a base + (bufnum) * BLCKSZ
authorTom Lane <[email protected]>
Fri, 12 Aug 2005 05:05:51 +0000 (05:05 +0000)
committerTom Lane <[email protected]>
Fri, 12 Aug 2005 05:05:51 +0000 (05:05 +0000)
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
src/backend/storage/buffer/bufmgr.c
src/include/storage/bufmgr.h

index 9d3c2e44ff2b57c1140f1577a68db6a11dacfa9c..ed38f8d874fc0d5e735a39d4195723e6927bb7b1 100644 (file)
 
 
 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;
-       }
 }
 
 /*
index 65169c53865bda797483a17d9ac8cc0a207f2ad9..af6cecbce3fff912df55cb6edd628e9cc578e03f 100644 (file)
@@ -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! */
index 9eea85bf9e887bdea130b4aca887845f5d187193..f0e169417c45e17c34547445c562328d6302e78e 100644 (file)
@@ -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) \
 )
 
 /*