From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 12 Aug 2005 05:05:51 +0000 (+0000)
Subject: Remove BufferBlockPointers array in favor of a base + (bufnum) * BLCKSZ
X-Git-Tag: REL8_1_0BETA1~129
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ae7e4a33b595c4f157d29e4584175a054b5b520;p=postgresql

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.
---

diff --git a/src/backend/storage/buffer/buf_init.c b/src/backend/storage/buffer/buf_init.c
index 52e6ae0222..5051e762d8 100644
--- a/src/backend/storage/buffer/buf_init.c
+++ b/src/backend/storage/buffer/buf_init.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/storage/buffer/buf_init.c,v 1.74 2005/08/08 03:11:44 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/buffer/buf_init.c,v 1.75 2005/08/12 05:05:50 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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 f148a5ea00..6243f2481e 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.192 2005/08/08 19:44:22 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/buffer/bufmgr.c,v 1.193 2005/08/12 05:05:50 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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 eb7268edfc..a88565e159 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.94 2005/08/08 03:12:16 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.95 2005/08/12 05:05:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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) \
 )
 
 /*